关于c ++:Debug Assertion在这样一个简单的例子中失败了

Debug Assertion Failed in such simple example

主.cpp

1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include"Simple.h"

using namespace std;

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

简单.cpp

1
2
3
4
5
6
7
8
9
10
11
12
#include"Simple.h"

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


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

简单.h

1
2
3
4
5
6
7
8
9
10
#pragma once
class Simple
{
public:
    Simple(void);
    ~Simple(void);

private:
    int* ptr;
};

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

Microsoft Visual C++ Debug Library
Debug Assertion Failed!

Program: ...ts\Visual Studio 2010 C++\simple error\Debug\simple
error.exe File: f:\dd\vctools\crt_bld\self_x86\crt\src\dbgdel.cpp
Line: 52

Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

For information on how your program can cause an assertion failure,
see the Visual C++ documentation on asserts.

(Press Retry to debug the application)

为什么会发生在这种常见的例子中?


您需要添加一个复制构造函数和赋值运算符。现在,你的台词

1
s = Simple();

执行以下操作:

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

此时,s中的指针指向释放的内存。当s超出作用域时,Simple析构函数试图重新释放s的指针指向的内存,并发生未定义的行为(在您的情况下,您的程序崩溃)。