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

时间:2011-06-21 07:59:47

标签: c++ destructor

#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 

构建..

...自毁

5 个答案:

答案 0 :(得分:10)

它是因为当你从函数返回值时编译器的copy-elision。在这种情况下,复制省略称为RVO - 返回值优化。

见这些

答案 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(并定义打印消息的复制构造函数)。

相关问题