动态数组类指针元素创建时触发访问违例异常的问题排查
问题分析与解决方案
问题还原
你遇到的场景是:
- 定义了
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
相关产品推荐
相关产品推荐

