2011-08-10 68 views
0

釋放一個二維數組我試圖使用Visual Studio 2005 & 2008年釋放在C二維數組:問題在C

void Free_C(int **Cmat) 
{ 
    int i; 
    for (i=0;i<ROW;i++) 
     free(Cmat[i]); 
    free(Cmat); 
} 

當到達第二自由行它錯誤說崩潰:

HEAP CURRUPTION DETECTED:...CRT detected that application wrote to memory after end of heap 

我分配的數組是這樣的:

C=malloc(ROW*sizeof(int*)); 
for (i=0;i<RC;i++) 
    C[i]=malloc(COL*sizeof(int)); 

我也試圖與calloc,但它會導致相同的錯誤。

+5

你是如何分配該數組:

例如,陣列可以一直使用以下方法分配呢?每個'free'應該對應一個你之前做過的'malloc'。 – sth

+2

您可以顯示您用於首先分配數組的代碼嗎? – JaredPar

+0

如果不知道如何分配數組,則無法真正回答這個問題。 –

回答

3

如果沒有先了解如何分配數組,則很難回答這個問題。假設數組本身以相似的方式分配,您發佈的代碼似乎是正確的。例如(檢查略去了錯誤)

int** Malloc_C(int row_size) { 
    int** ppArray = malloc(sizeof(int*) * ROW); 
    int i; 
    for (i = 0; i < ROW; i++) { 
    ppArray[i] = malloc(sizeof(int) * row_size); 
    } 
    return ppArray; 
} 
+0

多數民衆贊成在我做了 – DoronS

+1

@DoronS如果是這樣的話,那很可能你的程序的另一部分是腐敗陣列周圍的內存,從而導致「免費」問題。我首先檢查外部陣列的所有循環,並使用valgrind這樣的程序來幫助追蹤問題 – JaredPar

0

不知道你是如何分配的數組,這會可能意味着就是二維數組與第一個指針指向分配給通過malloc()分配整個內存緩衝區,並且指針陣列中的其餘指針指向內存緩衝區。因此,一旦你在指針數組的第一個指針上調用了free,你實際上已經釋放了整個內存緩衝區......再次調用free對數組中的另一個指針將試圖釋放已被釋放的內存。

int** ptr_array = malloc(sizeof(int*) * NUM_ROWS); 
*ptr_array = malloc(sizeof(int) * NUM_ROWS * NUM_COLUMNS); 

int* temp = *ptr_array; 
for (int i=0; i < NUM_ROWS; i++) 
{ 
    ptr_array[i] = temp; 
    temp += NUM_COLUMNS; 
}