删除类的析构函数中的数组

时间:2014-11-21 00:29:10

标签: c++ arrays memory-management

我有一个名为NameClass的成员:

class NameClass {
    public:

    int count;
    apple* array;
} 

和它的构造函数:

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

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

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

delete []apple;
or 
delete apple;

2 个答案:

答案 0 :(得分:2)

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

如果您收到错误

  

“这会导致错误(”指针被释放未分配“):”

您错过了使用array(或nullptr)正确初始化NULL,或者您向其传递了未分配内存的地址(如堆栈分配的引用)。< / p>

答案 1 :(得分:1)

delete []apple;无法编译,但您显然有运行时错误,因此您必须拥有delete []array;。首先,这是正确的

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

NameClass n1;
NameClass n2 = n1;

NameClass n1;
NameClass n2;
n2 = n1;

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