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

为何出现Read Access Violation错误?VS2015调试C++代码求助

排查Read Access Violation错误的原因及修复方案

嘿,咱们来一步步拆解你遇到的问题。首先看你初始化二维vector的代码,这就是问题的源头:

my_2d_array.push_back(*(new vector<int>()));

核心问题:错误的动态分配方式

你用new创建了一个vector对象,然后解引用把它的拷贝存入my_2d_array。但这里有两个大问题:

  • 动态创建的那个原始vector没有被delete,直接造成了内存泄漏;
  • 更关键的是,如果后面你的“de-initialising”代码里尝试用delete去释放这些元素(比如误以为容器里存的是指针),就会直接触发Read Access Violation——因为my_2d_array里的元素是栈上的vector拷贝,不是堆上的指针,对非指针对象调用delete属于非法内存操作。

正确的二维vector初始化姿势

完全没必要用new来搞这件事,vector本身就是RAII容器,会自动管理内存。给你两种更简洁安全的写法:

// 写法1:循环push空vector
for (int arr_index = 0; arr_index < total_entries; ++arr_index) {
    my_2d_array.push_back(vector<int>()); // 直接创建临时空vector存入容器
}

// 写法2:构造时直接指定大小(更推荐)
vector<vector<int>> my_2d_array(total_entries); // 一次性创建包含10个空vector的二维容器

关于“de-initialising”的注意事项

你根本不需要手动去销毁这个二维vector!当my_2d_array离开main函数的作用域时,它会自动递归销毁所有内部的vector元素,释放所有占用的内存。如果之前你写了类似delete &my_2d_array[i]或者delete my_2d_array[i]的代码,那这就是触发Read Access Violation的直接原因,删掉这些手动释放的代码就好。

错误触发的完整逻辑

如果你的销毁代码里尝试释放容器元素,而这些元素是通过拷贝new出来的vector得到的,你要么是在释放一个早已丢失的堆指针,要么是在释放栈上的局部对象,这两种情况都会导致非法内存访问,也就是你遇到的Read Access Violation错误。改用标准的vector初始化方式,去掉多余的手动释放代码,问题就能解决。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:45:44