C++运行出现Exception thrown: Write access violation错误如何解决
问题根因
- 触发访问异常的核心原因是
obj类的next指针未初始化:你申请了长度为100的obj数组,但每个对象的next都是野指针,执行n = n->next操作时会访问非法内存地址,直接触发写入访问违规。 - 类设计冗余:
n、k作为类成员变量完全不必要,二者是函数内临时遍历用的变量,放在类成员中会被多次调用修改,导致逻辑混乱、出现重复执行、数据损坏等异常表现。 - 逻辑缺失:要通过
next指针遍历数组存储数据,需要先手动建立数组元素的链表关联,让每个元素的next指向数组的下一个相邻元素。
修复后的完整代码
#include <iostream> using namespace std; class obj{ public: int val; obj* next; int current = 0; void func(int data){ obj* n = this; int k = 0; for(; k<current; n = n->next,k++){ cout<<"k= "<<k<<" = "<<n<<" = "<<n->val<<" curr= "<< current<<", "; } cout<<endl; n->val = data; current++; } void print(){ obj* n = this; int k = 0; for(; k<10;n = n->next,k++) { cout<<n->val<<" "; } } }; int main() { obj *m = new obj [100]; // 初始化next指针,建立数组元素的链表关联 for(int i=0;i<99;i++){ m[i].next = &m[i+1]; } m[99].next = nullptr; for(int i=2; i<=20;i+=2) { m->func(i); } m->print(); delete[] m; cout << endl; return 0; }
修复说明
- 移除了类中冗余的
n、k成员变量,改为对应函数内部的局部变量,避免变量被意外篡改导致逻辑异常。 - 新增了数组元素的
next指针初始化逻辑,让每个元素的next指向数组下一个相邻元素,最后一个元素的next置空避免野指针。 - 运行修改后的代码可正常输出
2 4 6 8 10 12 14 16 18 20,无异常报错。
内容的提问来源于stack exchange,提问作者With Orxan
相关产品推荐
相关产品推荐

