删除指针成员变量的数组内存

时间:2017-11-22 07:33:01

标签: c++ arrays destructor

我正在阅读一本教科书,它似乎表明当你有一个成员变量指针时,你必须将代码放在析构函数中才能删除内存。
它有点不清楚,但似乎代码必须看起来像这样:

private:  
double *aPtr;

public:  
~NumberArray(){ delete [ ] aPtr;}

这不是最终成为2个删除命令,因为析构函数已经删除了该数组中的第一个元素吗?此外,即使您的程序中有1行或更多行用于默认析构函数,析构函数也会自动执行默认工作吗?程序是先执行代码还是执行代码是析构函数的“自动”部分?

出于某种原因,我认为delete命令仅用于动态分配的内存。我想我错了吗?

2 个答案:

答案 0 :(得分:2)

  

这不是最终成为2个删除命令,因为析构函数已经删除了该数组中的第一个元素吗?

析构函数正在破坏指针(这是一个无操作)。但它根本没有触及指针指向的内容。所以除非你自己明确写一个任何删除操作,否则没有任何删除操作。

  

此外,即使您的程序中有1行或更多行用于默认析构函数,析构函数也会自动执行默认工作吗?

是的,析构函数将始终销毁对象的成员和基础(在执行析构函数体之后)。但同样,该成员是aPtr。这不是aPtr所指向的。

  

程序是先执行代码还是执行代码是析构函数的“自动”部分?

在析构函数体中,对象的任何成员仍然处于活动状态。这是有道理的,因为它们可能是清理相关操作所必需的。在那之后,他们确实被摧毁了。

答案 1 :(得分:-1)

您似乎对deletedelete[]之间的区别感到有些困惑。

delete的第一种形式(没有括号)用于销毁为单个对象分配的动态内存。不应在数组上使用此表单,因为在这种情况下,编译器只会调用析构函数一次。

带有方括号的第二种形式保证在用于数组的内存本身释放之前,将为动态分配的数组的每个元素调用析构函数。

简而言之:

// first form:
SomeClass* object = new SomeClass;
delete object;                     // SomeClass::~SomeClass is called once, which is good.

// second form
SomeClass* array = new SomeClass[N]; // SomeClass::SomeClass() is called N times.
delete[] array;      // SomeClass::~SomeClass is called N times, which is good.
delete array;        // YIKES!! SomeClass::~SomeClass is called only once. 
                     // This is terrible, as N-1 destructors did not get called.