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

动态数组类指针元素创建时触发访问违例异常的问题排查

问题分析与解决方案

问题还原

你遇到的场景是:

  • 定义了Container类,声明全局二级指针Container** models
  • 在main中执行models = new Container*[10000];后,调用models[0] = new Container();触发**访问违规(access violation while trying to write address 0x00000000)**异常

问题出在Container类的构造函数实现上:

class Container {
public:
    int **ar;
    Container() {
        for(int i=0;i<10;i++) ar[i]=0;
    }
    // ... 其他成员
};

核心原因

你在构造函数里直接操作了未初始化的二级指针ar:

  • ar作为类的成员变量,默认不会自动初始化,它的初始值是随机的(在你的场景中恰好是NULL)
  • 当你执行ar[i] = 0时,相当于尝试给NULL指针的第i个下标位置赋值,这本质是对无效内存地址(0 + i*sizeof(int*))的写入操作,直接触发了系统的内存访问保护机制,也就是你看到的访问违规异常。

修复方案

必须先给ar分配内存空间,再去初始化它的每个元素:

class Container {
public:
    int **ar;
    Container() {
        // 第一步:先初始化二级指针,分配容纳10个int*的数组
        ar = new int*[10];
        // 第二步:再逐个初始化每个元素为0
        for(int i=0;i<10;i++) ar[i]=0;
    }

    // 别忘了添加析构函数释放内存,避免内存泄漏
    ~Container() {
        // 如果后续给ar[i]分配了具体的int数组,要先释放每个ar[i]
        // for(int i=0; i<10; i++) {
        //     delete[] ar[i];
        // }
        // 最后释放ar本身
        delete[] ar;
    }
    // ... 其他成员
};

这样修改后,ar被正确初始化指向合法的内存空间,再对ar[i]赋值就不会触发访问违规了。

内容的提问来源于stack exchange,提问作者Artur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 08:07:38