簡體   English   中英

嘗試釋放2D動態分配的數組時程序崩潰

[英]Program crashes when trying to free a 2D dynamic allocated array

通常,很難理解發生了什么以及為什么發生。 在程序的開頭,我聲明了兩個2D動態數組(程序中使用的所有數組都具有相同的尺寸):

int **initial_array;
int **new_array; 

然后分配必要的內存:

//dynamic allocate arrays (1st Dimension)
initial_array = calloc(N,sizeof(int));
new_array = calloc(N,sizeof(int));

//check if the memory has been allocated correctly
if (initial_array==NULL || new_array==NULL) 
{
    printf("Error allocating memory!\n"); //print an error message
    return 1; //return with failure
}

for (i=0;i<N;i++)
{
    //dynamic allocate arrays (2nd Dimension)
    initial_array[i] = calloc(P, sizeof(int));
    new_array[i] = calloc(P, sizeof(int));
}

然后,我調用一個函數,該函數采用初始數組的值,生成另一個2D動態數組,我將其打印(在函數內部)並釋放(通過調用另一個函數)而沒有問題,然后將該數組存儲到new_array中:

new_array = create_new_array(some_data, initial_array);

然后,將值存儲到initial_array:

for (i=0;i<N;i++)
{
    for (p=0;p<P;p++)
    {
        initial_array[i][p] = new_array[i][p];
    }
}

free_array_in_function(new_array);

到現在為止還挺好。 問題出在我釋放陣列時。 initial_array工作完美:

//free memory
for (i=0;i<N;i++)
{
    free(initial_array[i]);
}

free(initial_array);

然后,我嘗試使用new_array但程序崩潰了:

//free memory
for (i=0;i<N;i++)
{
    free(new_array[i]);
}

free(new_array);


ERROR: Unhandled exception at 0x102d12b4 (msvcr90d.dll) in Genetic_v1.exe: 
0xC0000005: Access violation reading location 0xfeeefee8.

任何想法為什么會這樣?

//Function
int **create_new_array(double *some_data, int **individuals_table)
{
      int **children;

     //dynamic allocate array of children (1st Dimension)
     children = calloc(N,sizeof(int));

     //check if the memory has been allocated correctly
     if (children==NULL) 
     {
        printf("Error allocating memory!\n"); //print an error message
        return 1; //return with failure
     }

     for (cv01=0;cv01<N;cv01++)
     {
        //dynamic allocate array of Individuals (2nd Dimension)
        children[cv01] = calloc(P, sizeof(int));

        //check if the memory has been allocated correctly
        if (children[cv01]==NULL) 
        {
           printf("Error allocating memory!\n"); //print an error message
           return 1; //return with failure
        }
    }

    //Do some calculations

    return children;
}

因為您的第一次分配是錯誤的

initial_array = calloc(N,sizeof(int));
new_array = calloc(N,sizeof(int));

應該

initial_array = calloc(N,sizeof(int *));
new_array = calloc(N,sizeof(int *));

您很可能在64bit OS上嘗試此代碼,否則它可能會很痛苦。

另外,您會覆蓋不需要的指針new_array

new_array = calloc(N,sizeof(int));

或者for循環中

new_array[i] = calloc(P, sizeof(int));

因為你有這個

new_array = create_new_array(some_data, initial_array);

最后評論

free_array_in_function(new_array);

因為您要釋放兩次相同的指針。 當您嘗試訪問arryays時

free(initial_array[i]);

您正在取消引用已經釋放的指針。

指針不是這樣工作的,一旦您第一次調用calloc ,便有了一個pointer即表示內存虛擬地址的整數值,如果再次調用calloc並將其分配給前一個指針,則將覆蓋地址並因此導致內存泄漏。

然后你free你分配的指針create_new_array功能,但你不能free第一calloc版指針,因為你已經失去了對它的引用。

sizeof(int)sizeof(int *) 甚至有時候,根據平台的不同,您可能需要在此處使用sizeof(int *) ,即首先分配內存以保存指針。

為您

int **initial_array = calloc(N,sizeof(int *));
int **new_array = calloc(N,sizeof(int *));

稍后,您需要分別為指針分配內存。 現在您應該具有:

initial_array[i] = calloc(P,sizeof(int));

free_array_in_function(new_array)您正在釋放內存,這是您收到錯誤的原因。 您釋放內存兩次的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM