Почему деструктор не вызывается для возвращаемого объекта из функции? - PullRequest
18 голосов
/ 30 марта 2009

Я думал, что когда функция возвращает объект в стеке вызывающей функции, вызывающая функция получает копию исходного объекта, но деструктор исходного объекта вызывается, как только стек раскручивается. Но в следующей программе деструктор вызывается только один раз. Я ожидал, что он будет вызван дважды.

#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.
}

Но «деструктор MyClass» печатается только один раз. Мое предположение неверно или здесь что-то еще происходит?

1 Ответ

25 голосов
/ 30 марта 2009

Это особый случай, когда компилятору разрешено оптимизировать копию: это называется именованной оптимизацией возвращаемого значения (NRVO). По сути, компилятор выделяет память для объекта возврата на сайте вызова и позволяет функции заполнять эту память напрямую, вместо того, чтобы создавать объект на вызываемом сайте и копировать его обратно. Современные компиляторы делают это всегда, когда это возможно (в некоторых ситуациях это нелегко, поскольку в функции есть несколько путей возврата, которые возвращают различных экземпляров).

...