2009-03-30 16 views
15

Estaba pensando que cuando una función devuelve un objeto en la pila a la función de llamada, la función de llamada obtiene una copia del objeto original, pero se llama al destructor del objeto original tan pronto como la pila se desenrolla. Pero en el siguiente programa, el destructor se llama solo una vez. Esperaba que se llamara dos veces.¿Por qué no se llama al destructor para el objeto devuelto de la función?

#include <iostream> 

class MyClass 
{ 
public: 
    ~MyClass() { std::cout << "destructor of MyClass" << std::endl; } 
}; 

MyClass getMyClass() 
{ 
    MyClass obj = MyClass(); 
    return obj; // dtor call for obj here? 
} 

int main() 
{ 
    MyClass myobj = getMyClass(); 
    return 0; // Another dtor call for myobj. 
} 

Pero "destructor de MyClass" solo se imprime una vez. ¿Está equivocada mi suposición o hay algo más que está sucediendo aquí?

+0

¿Por qué escribe: "MyClass obj = MyClass();" ? "MyClass obj;" lo hará bien. Esto no es java;). –

+0

Sí, es debido a una programación mucho en Java antes :) – Srikanth

+0

@EvanTeran "_¿Por qué escribes:" MyClass obj = MyClass(); "?" MyClass obj; "funcionará bien_" estos son ** no ** equivalente en general. – curiousguy

Respuesta

21

Este es un caso especial donde el compilador puede optimizar la copia: esto se llama named return value optimization (NRVO). Básicamente, el compilador asigna memoria para el objeto de devolución en el sitio de llamadas y permite que la función complete esa memoria directamente en lugar de crear el objeto en el sitio llamado y copiarlo de nuevo. Los compiladores modernos hacen esto de forma rutinaria siempre que sea posible (hay algunas situaciones donde esto no es fácil ya que hay varias rutas de retorno en la función que devuelven instancias diferentes).

Cuestiones relacionadas