C++ Destructors输出问题:为什么示例代码不打印析构函数调用语句?
问题根本原因
你代码里的HelloWorld obj是定义在main函数栈上的局部对象,它的生命周期和main函数的作用域完全绑定,只有当main函数执行完return 0之前的所有逻辑、即将退出时,才会自动销毁栈对象调用析构函数。
而你在return前加了system("PAUSE"),程序运行到这里时会阻塞等待用户输入,此时main函数还没走到退出流程,析构函数自然不会触发。等你按下任意键跳过PAUSE后,程序会立刻执行return退出,控制台窗口会直接关闭,你来不及看到析构函数的输出内容。
你参考的书籍中同类代码能输出,大概率是书籍示例没有加system("PAUSE")语句,或者书籍的演示环境是在常驻的命令行终端中运行程序,不会在程序退出时自动关闭窗口,因此可以看到最后的析构输出。
可行的解决方法
- 方法1:给对象套独立的局部作用域,让对象在PAUSE执行前就完成销毁
修改后的main函数代码如下:
int main() { { // 把对象放在单独的大括号作用域内 HelloWorld obj; } // 大括号结束时obj生命周期结束,自动调用析构 system("PAUSE"); return 0; }
- 方法2:移除
system("PAUSE")语句,手动打开命令提示符(cmd),切换到编译生成的exe所在目录,手动输入exe文件名执行程序,程序完整执行完所有逻辑后会输出析构内容再结束。 - 方法3:使用动态分配对象手动控制生命周期,在PAUSE前手动释放对象触发析构:
int main() { HelloWorld* p_obj = new HelloWorld(); delete p_obj; // 手动delete时直接调用析构函数 system("PAUSE"); return 0; }
内容的提问来源于stack exchange,提问作者DA GAMER GURL
相关产品推荐
相关产品推荐

