我一直收到错误检测到堆腐败。我在这里已经阅读了几个问题,但我无法在我的代码中找到导致这种情况的原因。我正在尝试创建一个2d数组,它将保存从文本文件中读取的矩阵。
// Create a 2d matrix to hold the matrix (i = rows, j = columns)
matrix = new int*[cols];
for(int i = 0; i <= cols; i++) {
matrix[i] = new int[rows];
}
// Populate the matrix from the text file
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
inputFile >> matrix[i][j];
}
}
我的析构函数是:
for(int i = 0; i <= cols; i++) {
delete[] matrix[i];
}
delete[] matrix;
我已经尝试过调试,但在这种情况下确实提供了很多帮助。有什么建议吗?
答案 0 :(得分:5)
matrix = new int*[cols];
for(int i = 0; i <= cols; i++) {
matrix[i] = new int[rows];
}
对于包含cols
元素的数组,索引从0
到cols - 1
包含。
时将检测到堆损坏
delete [] matrix;
由于matrix[cols]
从数组绑定中写出一个位置。
更新
@DanielKO(谢谢伙伴:p)在评论中指出
存在不匹配,“填充矩阵......”循环使“i” 当它应该迭代“cols”时迭代“行”。
答案 1 :(得分:0)
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
inputFile >> matrix[i][j];
当你分配时,你从0到cols在i。现在你要把我变成行。
编辑:以下会尊重您评论的行/列规则并遵循RAII:
std::vector<std::vector<int>> matrix(rows, std::vector<int>(cols));
for( int i=0; i<rows; ++i ) {
for( int j=0; j<cols; ++j ) {
inputFile >> matrix[i][j];
}
}
// no need for delete matrix cleaned up when leaving scope.