为何出现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
相关产品推荐
相关产品推荐

