#include <iostream>
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
构建..
...自毁
答案 0 :(得分:10)
答案 1 :(得分:6)
编译器优化。
在其他编译器/优化设置中,可能会多次调用它。
请参阅此编译: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破坏...
答案 2 :(得分:6)
我想原因是'Get'中的返回值优化。
查看http://en.wikipedia.org/wiki/Return_value_optimization
实际上你的代码不是标准的例子,但也许你的编译器也适用它。
答案 3 :(得分:2)
这称为返回值优化,或RVO。
答案 4 :(得分:2)
尝试g++ -fno-elide-constructors
(并定义打印消息的复制构造函数)。