c – 为什么自动对象的析构函数被调用两次?
发布时间:2020-12-16 10:49:39 所属栏目:百科 来源:网络整理
导读:(我的问题的答案涉及复制构造函数,但复制发生在从函数返回时,而不是在对另一个类的方法调用中.我实际上看到了引用的可能重复,但没有从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的复制构造函数(也是默认的).
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |