0

主文件

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

using namespace std;

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

简单的.cpp

#include "Simple.h"

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


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

简单的.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->nBlockUse)

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

(按重试调试应用程序)

为什么会发生在如此常见的例子中?

4

1 回答 1

3

您需要添加一个复制构造函数和赋值运算符。目前,您的线路

s = Simple();

执行以下操作:

  • 创建一个临时Simple的,为其指向的指针分配内存。
  • 将其分配给s,它只是将指针从临时对象中复制出来。
  • 再次销毁临时文件,重新分配临时文件中的指针和中的指针现在指向的内存s

此时,指针 ins指向已释放的内存。当s超出范围时,Simple析构函数会尝试重新分配 memorys的指针指向,并发生未定义的行为(在您的情况下,您的程序崩溃)。

于 2013-11-10T22:55:03.503 回答