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;
}
También aparece bajo el nombre más general: copia elision. –
En realidad, este es un caso especial de RVO, llamado * Nombre * Optimización del valor de retorno. – dirkgently
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? –