Visual C++中析构函数是否销毁了正确的实例?
析构函数调用顺序的疑问解答
这是编译器的正确行为,既不是不良编程习惯导致的问题,也不是编译器bug。
我们一步步拆解代码的执行流程:
ShowBug sb = ShowBug("First Instance");
这行是拷贝初始化,由于C++17及以后的拷贝消除优化,编译器会直接在变量sb的内存位置构造第一个实例,不会产生临时对象。此时sb持有"First Instance"的实例,它作为main函数的局部变量,生命周期会持续到main函数执行完毕。sb = ShowBug("Second Instance");
这行代码会分三步执行:- 首先创建一个临时的ShowBug对象,构造时传入"Second Instance";
- 调用编译器自动生成的默认赋值运算符,把这个临时对象的成员(这里是字符串
S)拷贝到已存在的sb对象中; - 赋值操作完成后,这个临时对象的使命就结束了,立刻被编译器销毁,所以你会看到析构函数打印
Deleting Second Instance。
而第一个实例(sb原本持有的"First Instance"),会在main函数执行到末尾、离开局部作用域时才会被销毁,所以它的析构打印会出现在程序退出前。
另外补充一点:你的代码中pArray成员变量没有初始化,也没有在析构函数中处理,这属于潜在的内存问题,但和当前的析构顺序疑问无关。
内容的提问来源于stack exchange,提问作者Bob Bryan
相关产品推荐
相关产品推荐

