我有一个名为NameClass的成员:
class NameClass {
public:
int count;
apple* array;
}
和它的构造函数:
NameClass::NameClass()
{
count = 12;
array = new apple[count];
...
}
我应该在类的析构函数中删除这个数组吗?如何?
这会导致错误("释放的指针未分配" ):
delete []apple;
or
delete apple;
答案 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。