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

C++三层嵌套int动态数组读写触发访问违例问题求解

问题根因

出现访问违例有两个核心原因:

  1. 你的代码仅创建了两层动态数组(类型为int**),但你注释明确标注最终要实现meshFaces[num][0][2]的三层访问规则,需要int***类型才能支持,类型和维度不匹配时,访问到第二层后继续解引用必然触发内存越界。
  2. 打印meshFaces[878]仅输出指针地址,哪怕下标已经超出numFaces的合法范围,大概率不会直接触发崩溃,但对这个非法指针解引用读写值时,就会触发访问违例,需要先确认numFaces的取值合法。
排查步骤
  • 先校验numFaces的取值:确认剪贴板文本转int没有出错,numFaces的值必须大于你用到的最大下标(比如测试用的878),不能为负数或0。
  • 核对数组维度和需求是否匹配:你当前创建的两层数组最多只支持meshFaces[a][b]的两层访问,无法满足三层访问需求。
修复实现

假设你三层数组的长度约定为:

  • 第一层:长度为numFaces,对应每个面的索引
  • 第二层:固定长度3,对应「顶点/法线/UV」三种属性
  • 第三层:长度固定为3(如果你的实际长度不同可以自行修改参数)

裸指针实现方案

#include <iostream>
int main() {
    // 此处替换为你实际从剪贴板转换得到的numFaces,确保值大于你用到的最大下标
    int numFaces = 1000;
    // 第一层:创建numFaces个int**指针
    int*** meshFaces = new int**[numFaces];
    for (int i = 0; i < numFaces; i++) {
        // 第二层:每个面对应3个属性(顶点/法线/UV)
        meshFaces[i] = new int*[3];
        for (int j = 0; j < 3; j++) {
            // 第三层:每个属性下存储3个int值,可根据实际需求修改长度
            meshFaces[i][j] = new int[3];
        }
    }

    // 测试访问不会触发违例
    meshFaces[878][1][0] = 0;
    std::cout << meshFaces[878][1][0] << "\n";

    // 符合你预期的引用规则赋值
    // 0 = 顶点(Vertices)
    // 1 = 法线(Normals)
    // 2 = UV坐标(UVs)
    meshFaces[878][0][2] = 0;

    // 三层逐次释放内存,避免泄漏
    for (int i = 0; i < numFaces; i++) {
        for (int j = 0; j < 3; j++) {
            delete[] meshFaces[i][j];
        }
        delete[] meshFaces[i];
    }
    delete[] meshFaces;
    return 0;
}

优化方案(推荐)

如果各层长度固定,更建议用std::vector替代裸指针,不需要手动管理内存,也能避免new/delete使用不当导致的内存问题:

#include <vector>
#include <iostream>
int main() {
    int numFaces = 1000;
    // 三层vector定义,默认初始值为0
    std::vector<std::vector<std::vector<int>>> meshFaces(numFaces, std::vector<std::vector<int>>(3, std::vector<int>(3, 0)));

    // 直接按规则访问即可
    meshFaces[878][0][2] = 123;
    std::cout << meshFaces[878][0][2] << "\n";
    // 无需手动释放内存,离开作用域自动销毁
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 06:54:05