2013-01-17 27 views
1

執行我的代碼時出現雙重空閒或損壞錯誤。實際上,我只是在C(任何RxC維度,這就是爲什麼使用指針)中創建一個矩陣,交換兩行,打印結果,然後試圖釋放內存。當我不交換行時,釋放完美。當我這樣做時,它會崩潰。我試圖改變交換的方式無濟於事。我認爲它與臨時指針交換超出範圍有關,但我不確定這是否是問題,以及如何修復它。交換矩陣行後出現雙重空閒()錯誤

MatElement只是一個雙。

typedef double MatElement; 

主:

int main(int argc, char *argv[]) { 

    MatElement** matrix = matrixAlloc(3,3); 

    int i; 
    int j; 

    for(i = 0; i < 3; i++) { 
     for(j = 0; j < 3; j++) { 
      matrix[i][j] = i+j; 
     } 
    } 
    matrixPrint(matrix, "%5.1f", 3, 3); 
    swapRows(matrix, 0, 2); 
    matrixPrint(matrix, "%5.1f", 3, 3); 

    matrixFree(matrix); 
    return 0; 
} 

矩陣的分配方式:

MatElement **matrixAlloc(int nr, int nc) { 
    int i; 
    MatElement *ptr; 
    MatElement **A; 

    A = malloc(nr * sizeof(MatElement *)); /* array of ptrs */ 
    ptr = calloc(nr * nc, sizeof(MatElement)); /* matrix elements */ 
    for (i = 0; i < nr; i++) /* set row pointers properly */ 
     A[i] = ptr + nc * i; 
    return A; 
} 

他們被釋放的方式:

void matrixFree(MatElement **A) { 
    free(A[0]); 
    free(A); 
} 

其行交換方式:

void swapRows(MatElement** G, int pivotRow, int rowExamined) { 
    MatElement* temp; 

    temp = G[rowExamined]; 
    G[rowExamined] = G[pivotRow]; 
    G[pivotRow] = temp; 
} 

有沒有人有任何想法會導致這個雙free()/ invalid free()?

回答

3

在某些時候,你是交換矩陣的第一行到另一個位置,所以在matrixFree()free(A[0])嘗試,而不是由calloc()返回的指針的指針免費爲陣列的中間。您需要將原始指針保存在某個地方,以便您可以將其無障礙地傳遞至free()

+0

是的,這固定它。謝謝。 – NSchrading

1

您的矩陣看起來像這樣:

一個擁有所有指針都行的第一要素。所以最初,A [0]指向第0行,A [1]到第1行依此類推。

所以,當你試圖釋放矩陣時,你知道A [0]指向第一行。但是當時你假設你的矩陣元素處於連續的位置,並且A [0]將始終指向由calloc返回的初始指針。但是當你交換一些行(特別是第0行與其他任何行)時,A [0]不會指向由calloc返回的指針。

可能的解決方案涉及到像在像分配一個以上存儲器插槽:

A = malloc的(((NR + 1)*的sizeof(MatElement ));/陣列師生比*/

的然後存儲由calloc返回到A [NR]原始指針。

所以,A [NR]也將指向calloc返回指針。