当我尝试编译我的(琐碎的,附在下面的)代码时,我收到了这个错误:
调试断言失败!
程序:...... \ Project1.exe
文件:f:\ dd \ vctools \ crt \ crtw32 \ misc \ dbgdel.cpp
行:52
表达式:_BLOCK_TYPE_IS_VALID(pHead-> nBlockUse)
所以,这是我的代码:
class T1
{
private:
int* foo;
public:
T1()
{
foo = new int[4];
foo[0] = 1;
foo[1] = 2;
foo[2] = 3;
foo[3] = 4;
}
~T1()
{
delete[] foo;
}
};
int main()
{
T1 t1;
t1.~T1();
}
虽然它有点丑陋和不完整,但毫无疑问是正确的。我在遇到完全相同的错误后编写了这个,代码执行更复杂的内存管理,只是为了看看发生了什么。但是,仍然没有任何错误。
没有编译器错误/警告,没有链接器错误/警告。执行到达delete [] foo时发生错误;线。
好像这不够疯狂,当我将Solution Configuration从Debug切换到Release时,程序执行完全正常 - 执行到达main函数的末尾没有错误。有任何线索如何解决这个问题?
答案 0 :(得分:2)
您正在进行双重删除。首先调用~T1(),然后当main()超出范围时。正如First Jens所指出的,几乎没有理由直接调用析构函数。
在调试模式下发生错误,因为在调试时会检查对象以查看它是否已被删除。如果在给出错误的行上放置断点,您将看到第一次调用delete是正常的,并且第二次删除时会发生错误,当对象超出范围时会自动调用该错误。