[微软 VS 2013]C++在删除运算符"Debug Assertion Failed!"时失败

[MS VS 2013]C++ fail on delete operator "Debug Assertion Failed!"

本文关键字:Assertion Debug Failed 失败 运算符 删除 VS 微软 2013 C++      更新时间:2023-10-16

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

调试断言失败!

程序:。。。。。。\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时发生错误;线

似乎这还不够疯狂,当我将"解决方案配置"从"调试"切换到"发布"时,程序执行得非常好——执行到主函数的末尾,没有任何错误。有什么线索可以解决这个问题吗?

您正在执行双重删除。首先调用~T1(),然后当main()超出作用域时调用。正如FirstJens所指出的,几乎从来没有一个好的理由直接调用析构函数。

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