的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 ++文档。
(按“重试”调试应用程序)
为什么会出现这种常见的例子?
答案 0 :(得分:3)
您需要添加复制构造函数和赋值运算符。你的行
s = Simple();
执行以下操作:
Simple
,为其指针分配内存指向。s
,它只是将指针复制到临时。s
中指针所指向的内存。此时,s
中的指针指向释放的内存。当s
超出范围时,Simple
析构函数会尝试释放内存s
的指针再次指向,并且会发生未定义的行为(在您的情况下,程序崩溃)。< / p>