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

发布于 2024-11-16 15:49:39 字数 464 浏览 3 评论 0原文

#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 

构造..

破坏...

#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;
}

the console output is :

$ g++ -g -Wall -O0 testdestructor.cc
$ ./a.out 

construct ..

destruct...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

他不在意 2024-11-23 15:49:39

这是因为当您从函数返回值时,编译器会进行复制省略。在这种情况下,复制省略称为 RVO - 返回值优化。

请参阅这些

Its because of copy-elision by the compiler when you return the value from the function. In this case, the copy-elision is called RVO - Return Value Optimization.

See these

雅心素梦 2024-11-23 15:49:39

我想原因是“Get”中的返回值优化

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

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

I suppose the reason is return value optimization in 'Get'.

Have a look at http://en.wikipedia.org/wiki/Return_value_optimization

Actually your code is not the standard example, but maybe your compiler applies it here as well.

老旧海报 2024-11-23 15:49:39

编译器优化。

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

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

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

请注意,定义的构造函数并没有一直被调用,因为而是调用了编译器生成的复制构造函数。

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

...我在顶部定义了一个额外的复制构造函数你的代码:

Test(const Test& other)
{
    printf("cctor\n");
}

输出:
1 构造..
2 个系数
3 破坏...
4个要素
5 破坏...
6个元件
7 破坏...
8 破坏...

Compiler optimizations.

On other compilers/optimization settings, it might get called more than once.

See this compile: http://codepad.org/8kiVC3MM

Output:
1 construct ..
2 destruct...
3 destruct...
4 destruct...
5 destruct...

Note that the defined constructor wasn't called all those times because the compiler-generated copy constructor was called instead.

See this compile: http://codepad.org/cx7tDVDV

... where I defined an extra copy constructor on top of your code:

Test(const Test& other)
{
    printf("cctor\n");
}

Output:
1 construct ..
2 cctor
3 destruct...
4 cctor
5 destruct...
6 cctor
7 destruct...
8 destruct...

若有似无的小暗淡 2024-11-23 15:49:39

这称为返回值优化,或RVO

It's called return value optimization, or RVO.

白鸥掠海 2024-11-23 15:49:39

尝试 g++ -fno-elide-constructors (并定义一个打印消息的复制构造函数)。

Try g++ -fno-elide-constructors (and define a copy constructor that prints a message).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文