Debug Assertion在这样一个简单的例子中失败了

时间:2013-11-10 22:50:02

标签: c++ debugging allocation

的main.cpp

#include <iostream>
#include "Simple.h"

using namespace std;

int main()
{
    Simple s;
    s = Simple();
}

Simple.cpp

#include "Simple.h"

Simple::Simple(void)
{
    ptr = new int[10];
}


Simple::~Simple(void)
{
    delete [] ptr;
}

Simple.h

#pragma once
class Simple
{
public:
    Simple(void);
    ~Simple(void);

private:
    int* ptr;
};

当我运行main.cpp时,程序停止并返回错误:

  

Microsoft Visual C ++调试库   调试断言失败!

     

程序:... ts \ Visual Studio 2010 C ++ \ simple error \ Debug \ simple   error.exe文件:f:\ dd \ vctools \ crt_bld \ self_x86 \ crt \ src \ dbgdel.cpp   行:52

     

表达式:_BLOCK_TYPE_IS_VALID(pHead-&gt; nBlockUse)

     

有关程序如何导致断言失败的信息,   请参阅关于断言的Visual C ++文档。

     

(按“重试”调试应用程序)

为什么会出现这种常见的例子?

1 个答案:

答案 0 :(得分:3)

您需要添加复制构造函数和赋值运算符。你的行

s = Simple();

执行以下操作:

  • 创建一个临时Simple,为其指针分配内存指向。
  • 将其分配给s,它只是将指针复制到临时。
  • 再次销毁临时文件,释放临时中的指针和 s中指针所指向的内存。

此时,s中的指针指向释放的内存。当s超出范围时,Simple析构函数会尝试释放内存s的指针再次指向,并且会发生未定义的行为(在您的情况下,程序崩溃)。< / p>