大佬教程收集整理的这篇文章主要介绍了c – 为什么自动对象的析构函数被调用两次?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图了解自动对象的构造/破坏.我遇到了一些看起来很可疑的代码,所以我编写了自己的版本以努力理解它.简而言之,原始代码包含一个返回函数本地对象的函数(自动).这看起来不安全,所以我写了这个程序来探索它:
#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的析构函数时,调用堆栈是这样的:
@H_510_9@main ~Phantom
在托管语言中,我可以看到这一行:
phantom = getPhantom();
会破坏幻影1,但它不会触及幻影2.这是C,而不是Java.
@H_618_2@以上是大佬教程为你收集整理的c – 为什么自动对象的析构函数被调用两次?全部内容,希望文章能够帮你解决c – 为什么自动对象的析构函数被调用两次?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。