C++ delete []对象导致崩溃

hak*_*010 3 c++ crash class object delete-operator

我制作了一个动态的对象数组.当我调用delete []时,程序崩溃并停止响应.但它确实有奇怪的行为:调用所有析构函数和崩溃.看看这段代码和输出.分配所有阵列的所有内存.

//main file
#include "myobject.h"

int size;
myObject *foo;

//some operations to estimate size

foo = new myObject[size];

//some operations with myObject

std::cout<<"size: "<<size<<"\n";
std::cout<<"Deleting object\n";

size=0;
delete [] foo;
Run Code Online (Sandbox Code Playgroud)

下一个文件:

//myobject.h

class myObject
{
    public:
    int number;

    Object1 ob1[64]
    Object2 *ob2;

    myObject(){ };
    ~myObject()
    {
        std::cout<<"delete "<<number<<"\n";

        delete [] ob1;
        delete [] ob2;
    };
}
Run Code Online (Sandbox Code Playgroud)

并输出:

size: 11

Deleting object

delete 10

delete 9

delete 8

delete 7

delete 6

delete 5

delete 4

delete 3

delete 2

delete 1

delete 0
Run Code Online (Sandbox Code Playgroud)

然后它崩溃并停止响应.

Bau*_*gen 7

你只能调用delete[]返回的指针new[],你必须完成一次.这同样适用于deletenew.

特别是,你不能delete[] obj1因为它是一个内置数组,而不是一个指针,并且obj2只有它指向未分配的内存new[].


Mik*_*our 6

delete [] ob1;
Run Code Online (Sandbox Code Playgroud)

你没有new obj1; 它是包含在对象中的数组.删除未分配的任何内容会new产生未定义的行为,这可能是崩溃.

如果你要像这样玩杂耍指针,那么你需要了解三法则以避免你将遇到的下一个死亡陷阱.然后了解RAII和智能指针,忘掉这个危险的废话.