2013-02-24 26 views
7

Provenendo da uno sfondo Java, sono ancora un po 'confuso sull'allocazione della memoria in C++. Sono abbastanza sicuro che le prime due affermazioni siano corrette:C++ Allocazione della memoria sull'heap e stack?

void method() { 
    Foo foo; // allocates foo on the stack, and the memory is freed 
       // when the method exits 
} 

void method2() { 
    Foo *foo = new Foo(); // allocates foo on the heap 
    delete foo;    // frees the memory used by foo 
} 

Ma che dire di qualcosa del genere?

void method3() { 
    Foo foo = *new Foo(); // allocates foo on the heap, and then copies it to the stack? 
          // when the method exits, the stack memory is freed, but the heap memory isn't? 
} 

Say Ho aggiunto foo ad una matrice globale all'interno method3(). Se provassi ad accedere a uno dei membri dei dati di foo dopo l'uscita dal metodo, funzionerebbe? Ed è method3() incline a perdite di memoria?

Grazie in anticipo.

+1

'Foo pippo();' in realtà non assegna nulla. Dichiara una funzione. – chris

risposta

8
Foo foo(); 

dichiara una funzione dal nome foo che restituisce un oggetto Foo e non richiede alcun argomento. È noto come l'analisi più irritante in C++. Probabilmente dire:

Foo foo; 

Si crea un archivio foo oggetto a livello locale/automatico. L'oggetto viene automaticamente deallocato quando l'ambito { } in cui è dichiarato termina.


Foo *foo = new Foo(); // allocates foo on the heap 
delete foo; 

Questo è vero, l'oggetto su Freestore puntato da foo si rilascia una volta si chiama delete. Non c'è perdita di memoria.


Foo foo = *new Foo(); 

alloca un oggetto Foo su Freestore e poi una copia di tale oggetto viene utilizzato per inizializzare foo. Poiché non si dispone di un puntatore all'oggetto assegnato al freestore, causa una perdita di memoria. Si noti che se il distruttore di ha un codice che causa effetti collaterali, allora non si tratta solo di perdita di memoria, ma comportamento non definito.

+0

Intendevo 'Foo foo()' per chiamare il costruttore no argument per la classe 'Foo'. Ma hai ragione, lo cambierò nella domanda per evitare confusione. – nebulabrot

+1

@nebulabrot: 'Foo foo; 'fa quello, non' Foo foo(); ' –

+0

Perché comportamento indefinito se gli effetti collaterali sono presenti in Foo destructor? Posso pensare ad un paio di esempi con 'Foo' complesso in cui funzionerebbe perfettamente, anche senza perdite di memoria! – CygnusX1