You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Visual C++中析构函数是否销毁了正确的实例?

析构函数调用顺序的疑问解答

这是编译器的正确行为,既不是不良编程习惯导致的问题,也不是编译器bug。

我们一步步拆解代码的执行流程:

  1. ShowBug sb = ShowBug("First Instance");
    这行是拷贝初始化,由于C++17及以后的拷贝消除优化,编译器会直接在变量sb的内存位置构造第一个实例,不会产生临时对象。此时sb持有"First Instance"的实例,它作为main函数的局部变量,生命周期会持续到main函数执行完毕。

  2. sb = ShowBug("Second Instance");
    这行代码会分三步执行:

    • 首先创建一个临时的ShowBug对象,构造时传入"Second Instance";
    • 调用编译器自动生成的默认赋值运算符,把这个临时对象的成员(这里是字符串S)拷贝到已存在的sb对象中;
    • 赋值操作完成后,这个临时对象的使命就结束了,立刻被编译器销毁,所以你会看到析构函数打印Deleting Second Instance。

而第一个实例(sb原本持有的"First Instance"),会在main函数执行到末尾、离开局部作用域时才会被销毁,所以它的析构打印会出现在程序退出前。

另外补充一点:你的代码中pArray成员变量没有初始化,也没有在析构函数中处理,这属于潜在的内存问题,但和当前的析构顺序疑问无关。

内容的提问来源于stack exchange,提问作者Bob Bryan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 04:00:10