Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565

    C++ [Include esagerati] - [Allocazione dinamica della memoria]

    Salve.
    Ho oggi per voi ben due dubbi che vorrei essere chiarito.

    Nei miei programmi pezzotti includo SEMPRE il windows.h
    Noto che questo in automatico mi fa una quarantina di typedef, tra cui mi ricordo UINT, INT32, INT16, INT64, tutti i tipi di dato, e fesserie varie.
    Occupano memoria? Se si, io posso benissimo farne a meno. Per togliere tutte le varie scioccheze che non mi servono è necessario dover cambiare tutto il windows.h?
    Se invece non occupano memoria restatevene li tanto...

    Quesito 2
    Se io creo un intero
    int Intero;
    posso anche crearlo tramite puntatore
    int* Intero = new int;
    Il vantaggio del secondo è che posso eliminarlo quando mi pare
    delete Intero;
    Ma se io creo una semplice una variabile (non tramite puntatore), come posso eliminare una variabile quando non mi serve piu??

  2. #2

    Re: C++ [Include esagerati] - [Allocazione dinamica della memoria]

    Originariamente inviato da XWolverineX
    Nei miei programmi pezzotti includo SEMPRE il windows.h
    Noto che questo in automatico mi fa una quarantina di typedef, tra cui mi ricordo UINT, INT32, INT16, INT64, tutti i tipi di dato, e fesserie varie.
    Occupano memoria?
    In quanto dichiarazioni, direi di no.

    se io creo un intero
    int Intero;
    posso anche crearlo tramite puntatore
    int* Intero = new int;
    Il vantaggio del secondo è che posso eliminarlo quando mi pare
    delete Intero;
    Pero` devi pagare il prezzo (in termini di occupazione di memoria e rischio bug) dell'uso del puntatore...
    Ma se io creo una semplice una variabile (non tramite puntatore), come posso eliminare una variabile quando non mi serve piu??
    Dovresti chiarire cosa intendi per "eliminare".
    "Qualsiasi esperto ha paura di combattere usando la katana vera. Anch'io. Ma non ignoro la mia paura, riesco ad accettarla, e a metterla da parte accanto a me".

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    423
    Viene eliminata automaticamente quando esce dal suo ambito. Ovvero dalle parentesi graffe in cui è stata fatta la dichiarazione.

  4. #4
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Provo a spiegarmi con un esempio pratico
    codice:
    int a = 5;
    int b = 0;
    b = a;
    Come potete vedere, una volta che b ha assunto il valore di a, quest'ultima non serve piu', e potrebbe anche essere eliminata liberando della memoria. Cio è possibile se il codice fosse stato cosi

    codice:
    int *a = new int;
    *a = 5
    int b = 0;
    b = *a;
    delete a;
    Non so se sonos tato chiaro...

  5. #5
    Per quanto riguarda le variabili e puntatori, il discorso penso sia un po lungo.

    innanzi tutto dipende dalle variabili, tenendo conto del tempo di vita di esse, perché se hai molte variabili che poi restano inutilizzate nel corso dell'intero programma, allora usare i puntatori potrebbe essere una soluzione, ma se sono variabili site in procedure che, comunque sia hanno un tempo di vita molto minore rispetto al main allora non serve perché lo spazio a loro riservato viene liberato al termine della procedura.

    Vero anche è che, in termini di costi creare un puntatore e poi eliminarlo per sostituire ad esempio 3 variabili temporanee non ha questa grande convenienza perché avrei potuto usare sempre la stessa variabile (riutilizzo).

    La scelta puntatore vs variabile va fatta quindi a seconda di come è strutturato il programma e soprattutto sui tempi di vita delle variabili stesse.

    Almeno secondo me.

  6. #6
    Originariamente inviato da XWolverineX
    Provo a spiegarmi con un esempio pratico
    codice:
    int a = 5;
    int b = 0;
    b = a;
    Come potete vedere, una volta che b ha assunto il valore di a, quest'ultima non serve piu', e potrebbe anche essere eliminata liberando della memoria.
    Ho capito, ma il discorso e` talmente generico che e` arduo dire qualcosa di sensato. Dipende in primis da com'e` strutturato il codice (per fare un esempio banale, 'a' nel caso precedente potrebbe diventare una costante o addirittura macro).

    Cio è possibile se il codice fosse stato cosi

    codice:
    int *a = new int;
    *a = 5
    int b = 0;
    b = *a;
    delete a;
    Non so se sonos tato chiaro...
    Tieni conto che in questo secondo caso, con cpu x86 >= pentium e so a 32 bit, non risparmi spazio nel 99% dei casi; su amd64 addirittura, ne sprechi di piu`.

    Insomma: dipende
    "Qualsiasi esperto ha paura di combattere usando la katana vera. Anch'io. Ma non ignoro la mia paura, riesco ad accettarla, e a metterla da parte accanto a me".

  7. #7
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Ho capito
    Chiaramente era solo una curiosità, io continuerò ad usare il buon int a;

  8. #8
    Utente di HTML.it L'avatar di infinitejustice
    Registrato dal
    Nov 2001
    residenza
    Barcelona
    Messaggi
    772
    Secondo me il discorso è semplice... se la allochi dinamicamente, lo spazio allocato sopravvive allo scope se non lo disallochi esplicitamente. Non sopravvive pero il puntatore ad esso (per questo di solito si alloca e si restituisce il valore).

    Se la allochi senza puntatori lo spazio allocato viene liberato quando la variabile esce dal suo scope.
    Live fast. Troll hard.
    Pythonist | Djangonaut | Puppeteer | DevOps | OpenStacker | Lost in malloc
    Team Lead @Gameloft Barcelona

  9. #9
    Utente di HTML.it L'avatar di albgen
    Registrato dal
    Jun 2005
    Messaggi
    3,249
    Originariamente inviato da infinitejustice
    ....
    Se la allochi senza puntatori lo spazio allocato viene liberato quando la variabile esce dal suo scope.


    tutto quello che si alloca dinamicamente non viene MAI distrutto in modo implicito !!
    quindi che tu faccia

    int* puntatore = new int(5);

    oppure

    new int(5);

    è la stessa cosa.
    nel secondo caso, NON c'è modo di deallocare quel 5(sia dentro che fuori dalla scope di quella istruzione).
    la new è come se fosse una funzione che alloca memoria e ti ritorna un puntatore. quindi nel secondo caso lo alloca e perdi il puntatore...
    I got the remedy

  10. #10
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Se per esempio vorrei far crashare un pc

    [code]
    void main()
    {
    do {
    new int[100];
    }
    return;
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.