C++运行抛出0xC0000005访问0地址违规错误是什么原因?
异常根因排查与修复方案
你遇到的0xC0000005访问违例是strlen接收了空指针参数导致的,空指针来源于代码里的多个语法&语义错误:
1 核心触发问题:无参构造函数指针赋值错误
你写的无参构造代码存在逻辑错误:
MyString() :str{nullptr} { str = new char[1]; str = '\0'; // 错误行:直接修改指针本身的值,把刚分配到的内存地址覆盖为0,相当于把str设为空指针 }
这里应该是给str指向的内存空间赋值终止符,而非修改指针本身,修正如下:
MyString() :str{nullptr} { str = new char[1]; *str = '\0'; // 正确写法:对指针解引用后给指向的第一个字节赋值'\0' }
2 其他隐藏风险问题
- 内存分配释放不匹配:你所有内存都用
new[]分配,但析构函数用delete释放,属于未定义行为,会引发内存泄漏、随机崩溃等问题,修正为:
~MyString() { delete[] str; }
get_string方法语义错误:当前返回值为char只能拿到字符串首字符,如果你需要返回完整C风格字符串,修正为:
const char* get_string() const { return str; }
排查思路总结
- 遇到
Access violation reading location 0x00000000类错误时,第一时间检查对应访问位置的指针是否为空,可直接在崩溃行打断点查看指针变量的值快速定位。 - 动态内存操作要严格遵循
new配delete、new[]配delete[]的规则。
内容的提问来源于stack exchange,提问作者Ioan Săsărman
相关产品推荐
相关产品推荐

