2014-11-21 91 views
0

的析构函数我有类NameClass与成员:删除阵列中的类

class NameClass { 
    public: 

    int count; 
    apple* array; 
} 

和构造的这个:

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

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

这使得错误(“指针被释放没有被分配”):

delete []apple; 
or 
delete apple; 
+0

'delete [] array;' – 2014-11-21 00:31:55

+5

使用'std :: vector'。 – chris 2014-11-21 00:31:57

+0

@chris你知道这是一个家庭作业。 – mostruash 2014-11-21 00:34:07

回答

2

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

如果你所提到

一个错误“这使得错误(”被释放的指针是未分配“):”

你要么错过了初始化array正确地一个nullptr(或NULL),或者你传递了一个未分配内存的地址给它(就像一个栈分配引用)。

+0

@Vladislav请注意我在说什么(更新),Xcode没有什么区别恕我直言。 – 2014-11-21 00:38:22

+0

我写了这个'array = nullptr;删除数组;'在析构函数中,它的工作原理,但我不知道它是正确的。 – Vladislav 2014-11-21 00:42:44

+0

@Vladislav _“我写了这个'array = nullptr;删除数组;''_这应该总是有效的。虽然如果你使用'new []'来分配,你需要'delete []'作为挂件。只是'删除'导致未定义的行为。 – 2014-11-21 00:45:53

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

+0

_3_Rule在这里是一个很好的提及! – 2014-11-21 01:17:03