类构造函数中初始化vector嵌套字符矩阵报错,求解决方法
问题分析与解决
错误原因拆解
咱们来一步步揪出问题所在:
指针访问方式错误:你的
matrix是vector<vector<char>>*类型的指针,直接写this->matrix[i][j]完全搞错了访问逻辑。matrix[i]等价于*(matrix + i),这会让指针往后偏移i个vector<vector<char>>的内存块,而不是访问指针指向的那个二维容器的第i行。正确的姿势应该是先解引用指针,再访问元素:(*this->matrix)[i][j]。resize参数类型不匹配:初始化每行时你写了
this->matrix[i].resize(this->row, vector<char>(row));,这里resize的第二个参数类型完全不对。因为matrix的每一行是vector<char>,resize的第二个参数应该是char类型的初始值,而不是一个vector<char>对象。这行代码其实已经埋下了隐患,只是在赋值空格的时候才彻底暴露错误。
修正后的构造函数代码
下面是修正了所有错误的版本,直接就能正常运行:
Game::Game() { this->col = 20; this->row = 20; // 初始化二维vector:先创建包含col行的空容器 this->matrix = new vector<vector<char>>(this->col); for(int i = 0 ; i < this->col ; i++) { // 将每行resize为row个元素,同时把每个元素初始化为空格 (*this->matrix)[i].resize(this->row, ' '); } // 这里不需要额外循环赋值了,resize时已经指定了初始值为' ' // 如果坚持手动赋值,就用下面的循环: // for(int i = 0 ; i < this->col; i++) // for(int j = 0 ; j < this->row ; j++) // (*this->matrix)[i][j] = ' '; }
更优建议:抛弃裸指针,直接用容器
在C++里,除非必须使用指针的场景,尽量别用裸指针管理容器。你可以直接把matrix定义为vector<vector<char>>类型,既不用手动操心内存泄漏,代码也简洁太多:
修改game.h的私有成员:
private: int row; int col; vector<vector<char>> matrix; // 去掉指针 // other attributes
对应的构造函数(一行搞定初始化):
Game::Game() : col(20), row(20), matrix(col, vector<char>(row, ' ')) { // 初始化列表直接完成所有工作,连循环都省了 }
这样一行代码就创建了20行20列的二维字符矩阵,每个元素默认都是空格,简洁又安全。
内容的提问来源于stack exchange,提问作者Carlos A. Jimenez Holmquist
相关产品推荐
相关产品推荐

