C++中指针数组的正确删除方式及析构函数正确性咨询
关于指针数组的析构函数正确性分析
你完全说对了!直接对_array调用delete[]确实是错误的,我来给你掰扯清楚为什么:
原问题里的
_array是指向指针数组的指针,数组里每个元素是指向SomeObject对象的指针。
当你对指针数组用delete[]时,它只会销毁这个指针数组本身(也就是释放存储这些指针的内存),但完全不会去调用每个SomeObject对象的析构函数,更不会释放这些对象占用的内存——这就会导致内存泄漏!
正确的处理步骤应该是这样的:
- 第一步:遍历整个指针数组,对每个
SomeObject*指针调用delete,确保每个对象都被正确析构并释放内存 - 第二步:再调用
delete[] _array,释放存储指针的数组本身的内存
举个具体的代码例子:
~YourClassName() { // 先遍历销毁每个SomeObject对象,arraySize是你数组的元素个数,需提前记录 for (int i = 0; i < arraySize; ++i) { delete _array[i]; _array[i] = nullptr; // 可选操作,避免野指针问题 } // 再销毁指针数组本身 delete[] _array; _array = nullptr; }
额外提醒两点:
delete nullptr是安全的,所以即使数组里有空指针也不用额外判断,但提前判空也能让代码逻辑更清晰- 用
new[]创建的数组,必须对应使用delete[]销毁,别搞混delete和delete[]的用法
内容的提问来源于stack exchange,提问作者Shahaf Nahmias
相关产品推荐
相关产品推荐

