【发布时间】:2018-05-05 20:38:36
【问题描述】:
我正在阅读一本教科书,它似乎表明当你有一个指针成员变量时,你必须将代码放入析构函数中才能删除内存。
有点不清楚,但似乎代码必须如下所示:
private:
double *aPtr;
public:
~NumberArray(){ delete [ ] aPtr;}
这不是因为析构函数已经删除了该数组中的第一个元素,所以最终不是 2 个删除命令吗?此外,即使您的程序中有 1 行或更多行用于默认析构函数,析构函数是否会自动执行其默认工作?程序是先执行你的代码还是在析构函数的“自动”部分执行代码?
出于某种原因,我认为删除命令只是用于动态分配的内存。我想我错了?
【问题讨论】:
-
"当你有一个指针成员变量时,你必须在析构函数中放入代码才能删除内存",为什么?指针不必指向必须“删除”的内存。
-
“析构函数已经在删除该数组中的第一个元素” - 它在哪里做呢?您的析构函数仅调用
delete[]运算符。你也没有默认析构函数,因为你重载了它 -
析构函数会删除指针本身。由于指针是plain old data,它实际上什么都不做。是否必须为指针指向的 contents 添加
delete取决于。如果该类“拥有”指向的内容(并且不与其他所有者共享)它应该。否则,它不应该。并且,请根据指针指向的内容考虑是使用delete还是delete[]。 -
顺便说一句。析构函数和
delete是不同的东西。尽管delete为指向对象调用析构函数(假设为非nullptr),但也为任何其他构造对象调用析构函数。当“超出范围”时,作为局部变量实例化的类被破坏 -delete-ing 这将是非法的。离开main()后,全局变量中的构造对象被破坏 - 再次没有delete。更不用说对使用placementnew构造的实例的显式析构函数调用... -
您可能会将“指向数组第一个元素的指针”与“数组的第一个元素”混淆。
标签: c++ arrays destructor