使用vector构建图时出现0xC0000005崩溃问题求助
问题分析与修复方案
你的崩溃根本不是深拷贝问题,而是数组越界访问导致的内存错误(0xC0000005是Windows下的访问违规错误),具体有两个核心问题:
- 输入的顶点编号是1-based(比如示例里的1、2、3、4),但你用
new std::vector<...>[_N]创建的数组是0-based索引(范围0到_N-1),当输入的顶点编号是_N时(比如示例里的4,_N=4),videoList[4]就超出了数组的合法范围,直接触发内存访问错误。 - 你代码里最后访问
videoList[0][0].first,但示例输入里没有顶点0的边,videoList[0]是空vector,访问它的第一个元素会导致越界崩溃。
修复步骤
- 将输入的顶点编号转换为0-based:读取
p_i和q_i后,分别减1,确保索引在数组合法范围内。 - 替换动态分配的vector数组为
std::vector<std::vector<std::pair<int, int>>>,避免手动内存管理,更安全简洁。
修复后的代码
#include <iostream> #include <vector> int main() { int _N, _Q = 0; std::cin >> _N >> _Q; // 直接用vector嵌套结构,无需手动分配/释放内存 std::vector<std::vector<std::pair<int, int>>> videoList(_N); for (int i = 0; i < _N - 1; i++) { int p_i, q_i, r_i; std::cin >> p_i >> q_i >> r_i; // 转换为0-based索引,适配vector数组的范围 int u = p_i - 1; int v = q_i - 1; videoList[u].emplace_back(v, r_i); videoList[v].emplace_back(u, r_i); } std::cout << "TEST" << std::endl; // 先判断vector是否为空,避免越界访问 if (!videoList[0].empty()) { // 若要输出原1-based顶点编号,需加1;输出转换后的索引则直接取first std::cout << videoList[0][0].first + 1 << std::endl; } else { std::cout << "No edges for vertex 0" << std::endl; } return 0; }
关键改动说明
- 用
std::vector<std::vector<std::pair<int, int>>> videoList(_N)替代动态分配的数组,自动管理内存,避免delete[]的麻烦和潜在内存泄漏。 - 添加顶点编号的转换(减1),确保所有索引操作都在合法范围内。
- 增加空vector的判断逻辑,彻底避免访问空容器元素导致的崩溃。
内容的提问来源于stack exchange,提问作者haout
相关产品推荐
相关产品推荐

