C++项目访问多维vector报错3221225477,求问题排查
问题原因分析与修复方案
这个崩溃问题的根源非常典型——构造函数里的局部变量遮蔽了类的成员变量,导致你的Matrix对象内部的成员M根本没有被正确初始化,始终是空的vector,当toString()尝试访问M[0][0]时自然触发了访问违规(错误码3221225477对应Windows下的STATUS_ACCESS_VIOLATION,也就是我们常说的段错误)。
具体问题出在哪?
看你的Matrix构造函数:
Matrix(std::vector<std::vector<T> > m) { HEIGHT = m.size(); WIDTH = m[0].size(); std::vector<std::vector<T> > M(HEIGHT); // 这里是关键! for (int i = 0; i < HEIGHT; ++i) for (int j = 0; j < WIDTH; ++j) M[i].push_back(m[i][j]); };
你在构造函数里重新声明了一个名为M的局部vector,这个变量和类的成员变量M同名,导致代码里后续的M[i].push_back(...)操作的都是这个局部变量,而类的成员M完全没有被赋值,还是默认构造的空状态。当你调用toString()访问成员M时,就相当于访问一个空的二维vector,直接越界访问自然崩溃。
修复方法
只需要去掉构造函数里局部变量M的声明,直接操作类的成员变量即可:
Matrix(std::vector<std::vector<T> > m) { HEIGHT = m.size(); // 建议先检查m是否为空,避免m[0]访问越界 if (HEIGHT == 0) { WIDTH = 0; return; } WIDTH = m[0].size(); // 直接初始化成员变量M M.resize(HEIGHT); for (int i = 0; i < HEIGHT; ++i) { M[i].resize(WIDTH); for (int j = 0; j < WIDTH; ++j) { M[i][j] = m[i][j]; } } };
或者更简洁高效的方式,直接用初始化列表拷贝输入的vector(同时加上const&避免不必要的拷贝):
Matrix(const std::vector<std::vector<T> >& m) : M(m), HEIGHT(m.size()), WIDTH(m.empty() ? 0 : m[0].size()) {}
额外优化建议
- 始终在构造函数里处理空输入的情况,防止当输入
m是空vector时,m[0].size()触发二次崩溃。 - 修复
toString()里的循环逻辑:原注释代码会忽略每行最后一个元素,调整后可以完整输出所有元素:
std::string toString() { std::string r = ""; for (int i = 0; i < HEIGHT; ++i) { for (int j = 0; j < WIDTH; ++j) { r += std::to_string(M[i][j]); if (j != WIDTH - 1) { r += " "; } } if (i != HEIGHT - 1) { r += "\n"; } } return r; }
内容的提问来源于stack exchange,提问作者Davide
相关产品推荐
相关产品推荐

