索引二维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
相关产品推荐
相关产品推荐

