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

使用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,访问它的第一个元素会导致越界崩溃。

修复步骤

  1. 将输入的顶点编号转换为0-based:读取p_i和q_i后,分别减1,确保索引在数组合法范围内。
  2. 替换动态分配的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 00:52:34