为什么析构函数只被调用过一次

Why has the destructor been called only once?

本文关键字:一次 析构函数 调用 为什么      更新时间:2023-10-16
#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(并定义一个打印消息的复制构造函数(。