2013-07-09 80 views
0

我不断收到检测到的错误堆损坏。我已经阅读了这里的几个问题,但我无法完全弄清楚在我的代码中是什么导致了这个问题。我正在尝试创建一个2d数组,它将保存从文本文件中读取的矩阵。在C++中检测到堆损坏

// 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

你应该勉强曾经有自己管理内存在C++中。应该用RAII替换'new'和'delete'。 – chris

回答

5
matrix = new int*[cols]; 

for(int i = 0; i <= cols; i++) { 
    matrix[i] = new int[rows]; 
} 

对于cols元素的数组,该指数是从0cols - 1包含性。

delete [] matrix; 

由于matrix[cols]写的位置发送出绑定阵列的堆损坏会被检测到。


UPDATE

由于@DanielKO(谢谢你,伙计:P)在评论

存在不匹配时,指出 “填充基质......” 循环使得“我“ 迭代”行“,当它应该迭代”cols“。

+0

另外还有一个不匹配的问题,“填充矩阵...”循环让“我”迭代“行”时它应该迭代“cols”。 – DanielKO

+0

@DanielKO更新了答案。谢谢:) –

+0

谢谢你们两位!我知道这很奇怪。我只是无法发现它。 –

0
for (int i = 0; i < rows; i++) { 
    for (int j = 0; j < cols; j++) { 
     inputFile >> matrix[i][j]; 

当你分配你从0跑到的cols在我。现在你正在改变我是行。

编辑:下面会尊重您的评论行/列的规则,并按照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.