2012-06-18 21 views
8

Duplicar posible:
Why is the destructor not called for the returned object from the function?Destructor no llama al devolver una instancia local

me escribió algunas de código C++ (abajo), compilado con GCC 4.6 y se ha ejecutado correctamente. Pero no sé por qué no se llama al destructor de classA al regresar de createA().

Dado que ca es una variable local en createA() (es decir, en la pila), creo que se debe invocar su destructor al regresar de la función. Pero, de hecho, el destructor solo se llama una vez cuando regresa de la función main.

Además, devolver una instancia local siempre funciona bien en esta prueba. Me pregunto si es seguro devolver una instancia local en un marco de pila cuando el marco se ha reventado después de regresar.

Este es mi código:

#include <iostream> 
#include <string.h> 

class classA 
{ 
public: 
    classA() { len = 0; v = 0; } 

    classA(int a) 
    { 
     len = a; 
     v = new int[a]; 
     for (int i = 0; i < a; i++) 
      v[i] = 2*i; 
    } 

    ~classA() 
    { 
     if (v) 
      { 
      memset(v, 0, len * sizeof(int)); 
      delete [] v; 
     } 
    } 

    int *v; 
    int len; 
}; 

classA createA(int a) 
{ 
    classA ca(a); 
    return ca; 
} 

using namespace std; 

int main() 
{ 
    int a = 10; 
    classA ca = createA(a); 
    classA *pca = &ca; 
    for (int i = 0; i < a; i++) 
     cout << pca->v[i]; 
    cout << endl; 
    return 0; 
} 

Respuesta

14

Esto se conoce como valor de retorno optimización.

En resumen, el compilador no tiene que devolver una copia del objeto para optimizar el código.

Para CA es una variable local, es decir, en la pila [...]

No necesariamente

. ca se puede crear directamente en el contexto de llamada para evitar la copia adicional. La elisión de copia es la única optimización que un compilador puede realizar libremente y que puede alterar el comportamiento esperado.

+1

También aparece bajo el nombre más general: copia elision. –

+1

En realidad, este es un caso especial de RVO, llamado * Nombre * Optimización del valor de retorno. – dirkgently

+0

Gracias Grigore. Y tengo otra pregunta: si es seguro devolver una variable de clase local. ¿Es esta técnica, RVO, una especificación de C++ o simplemente un truco de optimización del compilador? –

Cuestiones relacionadas