如何正确释放double-pointer数组?解决memcheck未初始化值、非法写入报错
报错根因
- 你执行
Node** doublePtrNode= new Node* [10];时,仅申请了一块能存储10个Node*指针的数组内存,数组内的每个指针对象都是未初始化的野指针,没有指向合法的Node实例内存空间 - 你直接访问
doublePtrNode[i]->value相当于对野指针做解引用操作,64位系统下指针占8字节,memcheck首先会报8字节未初始化值引用的错误;紧接着向value写4字节int值,自然会触发非法写4字节的报错 - 后续
delete doublePtrNode[i]对野指针执行释放操作也属于非法行为,会引发未定义行为
正确修改方式
只需要在给value赋值前,先为每个数组元素指向的Node实例申请堆内存即可,修改后的完整代码如下:
struct Node { int value; Node* next = nullptr; // 建议初始化next指针为nullptr,避免野指针 }; int main() { Node** doublePtrNode = new Node* [10]; for (unsigned int i = 0; i < 10; i++) { doublePtrNode[i] = new Node(); // 先申请Node实例内存 doublePtrNode[i]->value = i; } // 后续正常释放逻辑不变 for (unsigned int i = 0; i < 10; i++) { delete doublePtrNode[i]; } delete[] doublePtrNode; return 0; }
补充优化建议
如果是C++11及更高版本的开发场景,更推荐使用标准容器和智能指针来避免手动管理内存的风险,不需要自己处理申请释放逻辑,也能从根源上避免这类野指针问题。
内容的提问来源于stack exchange,提问作者Steven
相关产品推荐
相关产品推荐

