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

索引二维vector scoremap时触发段错误,求问题原因分析

段错误原因分析:二维vector索引时的成员变量未初始化问题

你的段错误核心原因是类成员变量scoremap根本没被正确初始化,访问空vector的元素触发了内存越界。

问题细节

在构造函数中,你写的:

vector<vector<char>> displaymap(map_size, vector<char>(map_size, '?'));
vector<vector<int>> scoremap(map_size, vector<int>(map_size, 0));

这两行创建的是构造函数内的局部变量,和类的成员变量重名了——相当于你在局部作用域里隐藏了成员变量,类的成员scoremap始终是空的(size为0)。当你在generate_scoremap里用this->scoremap[x][y]访问时,空vector的[x]索引已经越界,直接触发段错误。

修复方案

1. 正确初始化成员变量

去掉局部变量的声明,直接给类的成员变量赋值:

Minesweeper::Minesweeper() {
    map_size = 5;
    mines = 8;
    score = 0;

    // 直接初始化类成员变量,而非创建局部变量
    displaymap = vector<vector<char>>(map_size, vector<char>(map_size, '?'));
    scoremap = vector<vector<int>>(map_size, vector<int>(map_size, 0));
};

或者用更高效的初始化列表方式(推荐):

Minesweeper::Minesweeper() 
    : map_size(5), mines(8), score(0),
      displaymap(5, vector<char>(5, '?')),
      scoremap(5, vector<int>(5, 0))
{};

2. 支持动态修改难度

如果后续要支持用户输入或难度选择,可以新增一个重置函数,动态更新map_size并重新初始化vector:

void Minesweeper::reset(int new_size, int new_mines) {
    map_size = new_size;
    mines = new_mines;
    score = 0;
    // 重新分配vector大小并初始化
    displaymap.assign(map_size, vector<char>(map_size, '?'));
    scoremap.assign(map_size, vector<int>(map_size, 0));
    // 重新生成雷区数据
    generate_scoremap();
}

补充说明

你手动创建vector时能正常运行,是因为那时候你操作的是已经正确初始化的局部vector;但类中的成员变量因为被局部变量隐藏,始终处于未初始化的空状态,访问自然会报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 19:37:41