我写了一个测试来检查在堆栈变量上覆盖赋值之前是否调用了析构函数,但我找不到任何合理的结果解释......
这是我的测试(在 Visual C++ 2008 发布模式下):
#include <iostream>
class C {
public:
char* ptr;
C(char p) { ptr = new char[100]; ptr[0] = p;}
~C() { std::cout << ptr[0] << ' '; delete [] ptr; }
};
int _tmain(int argc, _TCHAR* argv[])
{
{
C s('a');
s = C('b');
s = C('c');
s = C('d');
}
std::cin.get();
return 0;
}
如果我的假设是正确的,我希望得到“abcd”,如果错误,我期望得到“d”。相反,我得到“bcdx”。“x”根据分配给 ptr 的内存量而变化,表明它正在读取随机堆值。
我相信正在发生的事情(如果我错了,请纠正我)是每个构造函数调用都会创建一个新的堆栈值(让我们称它们为 s1、s2、s3、s4),然后分配让 s1.ptr 被 s4.ptr 覆盖. 然后 s4 在复制后立即被销毁,但 s1(带有悬空的 ptr)在离开范围时被销毁,导致 s4.ptr 的双重删除,而原始 s1.ptr 没有删除。
有什么办法可以解决不涉及使用 shared_ptrs 的这种无益行为?
编辑:将“删除”替换为“删除 []”