Почему деструктор был вызван только один раз?

#include  using namespace std; class Test { public: Test() { printf("construct ..\n"); } ~Test() { printf("destruct...\n"); } }; Test Get() { Test t = Test(); return t; } int main(int argc, char *argv[]) { Test t = Get(); return 0; } 

консольный выход:

 $ g++ -g -Wall -O0 testdestructor.cc $ ./a.out 

построить ..

уничтожение …

Я полагаю, что причиной является оптимизация возвращаемого значения в «Get».

Взгляните на http://en.wikipedia.org/wiki/Return_value_optimization

На самом деле ваш код не является стандартным примером, но, возможно, ваш компилятор также применяет его здесь.

Его из-за копирования-элиты компилятором, когда вы возвращаете значение из функции. В этом случае копирование называется RVO – Оптимизация возвращаемого значения.

См. Эти

  • Оптимизация возвращаемого значения
  • Копирование элиции

Оптимизация компилятора.

В других настройках компилятора / оптимизации он может вызываться более одного раза.

См. Этот компилятор: http://codepad.org/8kiVC3MM

Выход:
1 конструкция ..
2 разрушить …
3 разрушить …
4 разрушить …
5 уничтожить …

Обратите внимание, что указанный конструктор не был вызван все эти времена, потому что вместо него был вызван созданный компилятором конструктор.

См. Этот компилятор: http://codepad.org/cx7tDVDV

… где я определил дополнительный конструктор копии поверх вашего кода:

 Test(const Test& other) { printf("cctor\n"); } 

Выход:
1 конструкция ..
2 cctor
3 разрушить …
4 cctor
5 уничтожить …
6 cctor
7 разрушить …
8 разрушить …

Это называется оптимизацией возвращаемого значения или RVO .

Попробуйте g++ -fno-elide-constructors (и определите конструктор копирования, который печатает сообщение).