2010-02-18 9 views
5

cose curiosi con g ++ (forse anche con altri compilatori?):C++ allocazione in pila agisce stranamente

struct Object { 
     Object() { std::cout << "hey "; } 
     ~Object() { std::cout << "hoy!" << std::endl; } 
}; 

int main(int argc, char* argv[]) 
{ 
     { 
       Object myObjectOnTheStack(); 
     } 
     std::cout << "===========" << std::endl; 
     { 
       Object(); 
     } 
     std::cout << "===========" << std::endl; 
     { 
       Object* object = new Object(); 
       delete object; 
     } 
} 

Compied con g ++:

=========== 
hey hoy! 
=========== 
hey hoy! 

Il primo tipo di allocazione non costruisce l'oggetto. Cosa mi manca?

risposta

12

Il primo tipo di costruzione non sta effettivamente costruendo l'oggetto. Al fine di creare un oggetto in pila utilizzando il costruttore predefinito, è necessario omettere s'

Object myObjectOnTheStack; 

tuo stile corrente della definizione () dichiara invece una funzione denominata myObjectOnTheStack che restituisce un Object.

+0

Prova 'oggetto myObjectOnTheStack;' cioè senza il '()' – Justicle

+0

@Jerry, grazie ho corretto la terminologia – JaredPar

+4

... "invece * * dichiara una funzione di" ... – Potatoswatter

4

Ancora un altro esempio di "analisi più irritante". Invece di definire un oggetto, hai dichiarato una funzione denominata myObjectOnTheStack che non accetta argomenti e restituisce un Object.

2
Object myObjectOnTheStack(); 

è una dichiarazione anticipata di una funzione myObjectOnTheStack prendendo parametri e restituire un Object.

quello che vuoi è

Object myObjectOnTheStack;