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

qiu*_*fei 9 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;
}
Run Code Online (Sandbox Code Playgroud)

控制台输出是:

$ g++ -g -Wall -O0 testdestructor.cc
$ ./a.out 
Run Code Online (Sandbox Code Playgroud)

构造..

破坏...

Naw*_*waz 10

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

看到这些


Mer*_*ham 6

编译器优化.

在其他编译器/优化设置中,它可能会被多次调用.

看到这个编译:http://codepad.org/8kiVC3MM

输出:
1个构造...
2个破坏...
3个破坏...
4个破坏.​​..
5个破坏......

请注意,所有那些时候都没有调用定义的构造函数,因为调用了编译器生成的复制构造函数.

请参阅此编译:http://codepad.org/cx7tDVDV

...我在你的代码之上定义了一个额外的拷贝构造函数:

Test(const Test& other)
{
    printf("cctor\n");
}
Run Code Online (Sandbox Code Playgroud)

输出:
1个构造..
2个cctor
3 destruct ...
4 cctor
5 destruct ...
6 cctor
7 destruct ...
8 destruct ...


Ste*_*han 6

我想原因是'Get'中的返回值优化.

看看http://en.wikipedia.org/wiki/Return_value_optimization

实际上你的代码不是标准的例子,但也许你的编译器也在这里应用它.