首页 > 解决方案 > C++:默认析构函数:它会删除成员指针指向的数组吗?

问题描述

如果我这样声明 MyObj 类:

class MyObj: {
  private:
    uint8_t *arrayPtr;
  public:
    void makeArray();
}

void MyObj::makeArray() {
  arrayPtr = new uint8_t [10];
}

然后我打电话:

void func() {
  MyObj testObj;
  testObj.makeArray();
}

既然 func 已经运行并完成,并且 testObj 可以被忘记,那么 10 字节数组是否会从堆栈中删除?或者我是否需要为 MyObj 创建一个显式析构函数来测试数组的存在并在其上调用 delete 函数?

标签: c++pointersmemory-managementmemory-leaks

解决方案


您不能在此代码段中调用 delete

MyObj testObj;
testObj.makeArray();
delete testObj;

因为 testObj 不是由使用运算符 new 分配的内存地址分配的指针。

您需要在类定义中至少添加一个初始化器和析构器

class MyObj {
  private:
    uint8_t *arrayPtr = nullptr;
  public:
    ~MyObj() { delete [] arrayPtr; }
    void makeArray();
};

请注意,您应该将复制构造函数和复制赋值运算符定义为已删除,或者您必须显式定义它们。

还要记住,函数 makeArray 是不安全的。如果用户第二次调用它,就会出现内存泄漏,因为之前分配的内存不会被删除。

而且您没有数组作为该类的数据成员。你有一个指针。该指针将与包含该指针的对象一起从堆栈中释放。但是,如果不调用运算符 delete [],则不会释放动态分配的数组。


推荐阅读