【问题标题】:C++ delete [] object causes crashC++ delete [] 对象导致崩溃
【发布时间】:2015-02-11 16:35:02
【问题描述】:

我制作了一个动态的对象数组。当我调用 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;

下一个文件:

//myobject.h

class myObject
{
    public:
    int number;

    Object1 ob1[64]
    Object2 *ob2;

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

        delete [] ob1;
        delete [] ob2;
    };
}

还有输出:

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

然后它崩溃并停止响应。

【问题讨论】:

  • ob2 是如何分配的?
  • 为什么要在析构函数中删除ob1?

标签: c++ class object crash delete-operator


【解决方案1】:

您只能在new[] 返回的指针上调用delete[],并且您必须只执行一次。这同样适用于deletenew

特别是,您不能delete[] obj1,因为它是一个内置数组,而不是一个指针,并且obj2 仅当它指向使用new[] 分配的未释放内存时。

【讨论】:

    【解决方案2】:
    delete [] ob1;
    

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

    如果您要处理这样的指针,那么您需要了解Rule of Three 以避免遇到下一个死亡陷阱。然后了解RAII and smart pointers,忘记这些危险的废话。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-25
      • 2011-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多