2011-05-13 30 views
16

probé el siguiente programa en Visual Studio 2010.C++ comportamiento destructor

#include <iostream> 
using namespace std; 

class A { 
public: 
     int p; 

     /*A(){ 
      cout << "Constructor A" << endl; 
     }*/ 

     ~A(){ 
      cout << "Destructor in A" << endl; 
     } 
}; 

class D: public A 
{ 
public: 

     /*D(){ 
      cout << "Constructor D" << endl; 
     }*/ 

     ~D(){ 
      cout << "Destructor in D" << endl; 
     } 
}; 

int main() 
{ 
    D d = D(); 
    cout << "Exiting main" << endl; 
} 

La salida que me dieron fue -

Destructor in D 
Destructor in A 
Exiting main 
Destructor in D 
Destructor in A 

no soy capaz de entender por qué el destructor de la clase D y A se llaman antes de ejecutar la instrucción "Salir principal"?

he intentado otra cosa - que sin comentar el constructor de la clase D en el código anterior, la salida fue como yo esperaba -

Constructor D 
Exiting main 
Destructor in D 
Destructor in A 

Qué me estoy perdiendo aquí?

Respuesta

19

La línea

D d = D(); 

primero crea un objeto no identificado temporal, que luego se copia en d. Lo que ves es que el objeto temporal se destruye cuando la declaración finaliza. El objeto con nombre d se destruye cuando se sale del alcance, después de que se complete main().

Si agrega un constructor de copia al D, verá que se invoca.

Al comentar el constructor, creo que ve el comportamiento esperado porque el compilador puede hacer algunas optimizaciones.

+0

No explica por qué el segundo ejemplo ya no imprime las llamadas al destructor. – Xeo

+0

Se podría decir cómo debería ser (: –

+0

El compilador solo puede realizar optimizaciones inobservables. Aunque copie elisión, la llamada aún se debe imprimir. – Xeo