尝试释放2D动态分配的数组时,程序崩溃

时间:2014-12-17 14:05:07

标签: c dynamic-memory-allocation dynamic-arrays

一般来说,很难理解发生了什么以及为什么会发生。 在程序的开头我声明了两个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动态数组,我打印(在函数内部)和free(通过调用另一个函数)没有问题,我将这个数组存储到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;
}

3 个答案:

答案 0 :(得分:3)

因为你的第一次分配是错误的

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操作系统上尝试使用此代码,否则它可能会偶然发生。

同样,你覆盖了你不需要的指针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 ed指针,因为你丢失了对它的引用

答案 1 :(得分:3)

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));

答案 2 :(得分:2)

free_array_in_function(new_array)中,你释放的内存就是你的原因 得到错误。你释放内存两次的原因。