删除类析构函数中的数组

Deleting array in destructor of the class

本文关键字:数组 析构函数 删除      更新时间:2023-10-16

我有类名称类与成员:

class NameClass {
    public:
    int count;
    apple* array;
} 

和构造函数:

NameClass::NameClass()
{
    count = 12;
    array = new apple[count];
    ...
}

我应该在类析构函数中删除这个数组吗?又如何?

这会导致错误("未分配正在释放的指针"):

delete []apple;
or 
delete apple;

delete []array;应该是析构函数中使用的正确删除操作。

如果您收到上述错误

"

这会产生错误("未分配正在释放的指针"):"

您要么错过了使用 nullptr(或 NULL)正确初始化array,要么将未分配内存的地址传递给它(如堆栈分配引用)。

delete []apple;不会编译,但你显然有一个运行时错误,所以你必须有delete []array;。首先,这是正确的

假设您的类几乎是微不足道的,则错误的原因可能是两个 NameClass 对象具有指向同一数组的array指针。如果您的类没有用户定义的复制构造函数和/或赋值运算符,则可能会发生这种情况,在这种情况下,编译器将为您生成一个。如果你然后做这样的事情

NameClass n1;
NameClass n2 = n1;

NameClass n1;
NameClass n2;
n2 = n1;

在代码中,编译器只会将所有成员(包括array指针)相互分配,使array指向两个对象中的同一块内存(在后一种情况下,会导致最初在 n2 构造函数中分配的内存泄漏)。您需要做的是定义复制构造函数和赋值运算符,以便它们复制 array 指向的数组。因为您在析构函数、复制构造函数和复制赋值运算符(以及在构造函数中,但这很明显)中执行的操作必须相互兼容,所以这称为三法则。