c – 为什么自动对象的析构函数被调用两次?

c – 为什么自动对象的析构函数被调用两次?,第1张

概述(我的问题的答案涉及复制构造函数,但复制发生在从函数返回时,而不是在对另一个类的方法调用中.我实际上看到了引用的可能重复,但没有从vector :: copy制作的副本中推断出来:) push_back我的函数在这里也复制了.也许我应该有.) 我试图了解自动对象的构造/破坏.我遇到了一些看起来很可疑的代码,所以我编写了自己的版本以努力理解它.简而言之,原始代码包含一个返回函数本地对象的函数(自动) (我的问题的答案涉及复制构造函数,但复制发生在从函数返回时,而不是在对另一个类的方法调用中.我实际上看到了引用的可能重复,但没有从vector :: copy制作的副本中推断出来:) push_back我的函数在这里也复制了.也许我应该有.)

我试图了解自动对象的构造/破坏.我遇到了一些看起来很可疑的代码,所以我编写了自己的版本以努力理解它.简而言之,原始代码包含一个返回函数本地对象的函数(自动).这看起来不安全,所以我写了这个程序来探索它:

#include <stdio.h>class Phantom{private:    static int counter;    int ID;public:    Phantom()    {        ++counter;        ID = counter;        printf("Phantom %d constructed.\n",ID);    };    virtual ~Phantom()    {        printf("Phantom %d destructed.\n",ID);    };    voID speak()    {        printf("Phantom %d speaks.\n",ID);    };};int Phantom::counter = 0;Phantom getPhantom(){    Phantom autophantom;    return autophantom; // THIS CAN'T BE SAFE}int main(){    Phantom phantom;    phantom = getPhantom();    phantom.speak();    return 0;}

我得到这个输出:

Phantom 1 constructed.Phantom 2 constructed.Phantom 2 destructed.Phantom 2 destructed.Phantom 2 speaks.

这是输出中的第四行让我感到困惑.

输入main时自动构建Phantom 1.

输入getPhantom时会自动构建幻像2.

当getPhantom退出时,Phantom 2会自动被破坏(这就是为什么我认为从getPhantom返回它是不安全的).

但在那之后我很困惑.根据调试器,getPhantom在第四行输出出现之前返回.当第二次调用Phantom的析构函数时,调用堆栈是这样的:

main~Phantom

在托管语言中,我可以看到这一行:

phantom = getPhantom();

会破坏幻影1,但它不会触及幻影2.这是C,而不是Java.

是什么导致第二次调用Phantom 2的析构函数?

解决方法 你返回一份副本.因此,getPhantom()中的变量在作用域的末尾被销毁,并且你的副本也是ID 2.这是因为在返回时它调用了不增加ID的复制构造函数(也是默认的). 总结

以上是内存溢出为你收集整理的c – 为什么自动对象的析构函数被调用两次?全部内容,希望文章能够帮你解决c – 为什么自动对象的析构函数被调用两次?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1223106.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存