为什么析构函数只被调用过一次
Why has the destructor been called only once?
#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
构造。。
析构函数。。。
这是因为当您从函数返回值时,编译器会进行复制省略。在这种情况下,复制省略称为RVO-返回值优化。
查看这些
- 回报值优化
- 复制省略
我想原因是'Get'中的返回值优化。
看看http://en.wikipedia.org/wiki/Return_value_optimization
实际上,您的代码不是标准示例,但也许您的编译器也在这里应用了它。
编译器优化。
在其他编译器/优化设置中,它可能会被调用多次。
请参阅此编译:http://codepad.org/8kiVC3MM
输出:
1构造
2个析构函数
3销毁
4销毁
5销毁。。。
请注意,定义的构造函数并没有一直被调用,因为编译器生成的复制构造函数被调用了。
请参阅此编译:http://codepad.org/cx7tDVDV
我在你的代码上定义了一个额外的复制构造函数:
Test(const Test& other)
{
printf("cctorn");
}
输出:
1构造
2 cctor
3销毁
4 cctor
5销毁
6 cctor
7销毁
8销毁。。。
它被称为返回值优化,或RVO。
尝试g++ -fno-elide-constructors
(并定义一个打印消息的复制构造函数(。
相关文章:
- C++析构函数调用两次,堆栈分配的复合对象
- 对于优化级别为 0 的 std::vector,析构函数被调用两次
- 循环中本地对象的析构函数是否保证在下一次迭代之前被调用?
- Singleton模式中的手动析构函数调用:调用多次
- 为什么这个自定义分配器的析构函数在 GCC/MSVS 的 stdlib 中被调用两次
- 在共享指针的值中调用 std::swap 调用一堆构造函数和析构函数
- 两个单链列表共享同一个节点和析构函数两次删除相同的内存
- 析构函数在 lambda 捕获说明符中声明的类实例上运行两次
- 为什么在这里调用析构函数两次
- 析构函数在与 STL 的共享指针中调用两次
- 为什么我的析构函数被调用多次
- 为什么临时的生存期延长会导致析构函数被多次调用
- 当通过引用传递包含指针成员的类对象时,为什么要多次调用析构函数?我该如何更正
- 类析构函数在创建shared_ptr时调用两次
- [c++]为什么我的类析构函数被调用两次?
- 为什么析构函数被调用两次,而构造函数只被调用一次
- delete[]在调用析构函数后一次释放内存
- 为什么析构函数只被调用过一次
- 只能在析构函数中释放一次的资源的惯用移动构造器
- 我的析构函数每隔一秒调用一次