You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确释放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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 17:06:04