类内初始化二维std::array Release正常Debug构建下标越界问题
问题原因
你的代码中std::array的维度定义和遍历逻辑不匹配,触发了数组越界:
- 成员变量
std::array<std::array<T, colSize>, rowSize> matrix的结构是:外层共有rowSize个元素(对应行数),每个元素是长度为colSize的内层数组(对应列数)。访问规则为matrix[行索引][列索引],其中行索引范围是0 ~ rowSize - 1,列索引范围是0 ~ colSize - 1。 - 构造函数的循环逻辑写反了:外层循环以
colSize为上限、把循环变量i作为行索引,内层循环以rowSize为上限、把循环变量j作为列索引,当rowSize和colSize不相等时,列索引j会超出内层数组的最大长度,导致越界。
以你测试的TwoDArray<int,2,3>为例:colSize=2、rowSize=3,内层数组最大列索引为1,但内层循环的j会遍历到2,访问matrix[i][2]直接触发越界。
Debug模式下Visual Studio默认开启STL边界检查,因此会直接抛出越界错误;Release模式下关闭了边界检查,虽然没有报错,但属于未定义行为,存在崩溃风险。
修复方法
二选一即可:
方案1:调整遍历逻辑匹配数组定义
把循环的上下限和索引对应关系改对即可:
template <class T,unsigned int colSize,unsigned int rowSize> class TwoDArray{ public: TwoDArray(){ // 外层遍历行,上限为rowSize for (int i = 0; i < rowSize; ++i) { // 内层遍历列,上限为colSize for (int j = 0; j < colSize; ++j) { matrix[i][j] = j; std::cout << matrix[i][j] << " "; } std::cout << " " << i << std::endl; } } private: std::array<std::array<T, colSize>, rowSize> matrix; };
方案2:调整数组定义匹配原有遍历逻辑
如果你希望第一个索引对应列、第二个索引对应行,修改成员变量的维度顺序即可:
private: std::array<std::array<T, rowSize>, colSize> matrix;
补充:你原有代码的类定义末尾缺少分号,也会导致编译报错,修复时记得补上。
内容的提问来源于stack exchange,提问作者matthew
相关产品推荐
相关产品推荐

