[MS VS 2013] C ++在删除操作符上失败"调试断言失败!"

时间:2015-10-30 20:59:31

标签: c++ visual-studio-2013

当我尝试编译我的(琐碎的,附在下面的)代码时,我收到了这个错误:

  

调试断言失败!

     

程序:...... \ 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函数的末尾没有错误。有任何线索如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

您正在进行双重删除。首先调用~T1(),然后当main()超出范围时。正如First Jens所指出的,几乎没有理由直接调用析构函数。

在调试模式下发生错误,因为在调试时会检查对象以查看它是否已被删除。如果在给出错误的行上放置断点,您将看到第一次调用delete是正常的,并且第二次删除时会发生错误,当对象超出范围时会自动调用该错误。