为什么可以释放/删除返回的对象,但是不能释放/删除通过参数输入的对象?

时间:2015-05-06 12:24:32

标签: c memory-management

据我了解,

int * createArray ( void )
{
     int * arr = (int*)malloc(3*sizeof(int));
     arr[0] = 69; arr[1] = 69; arr[2]; 
     return arr;
}

int main ()
{
    int * myArray = createArray();
    free myArray;
    return 0;
}

会将数组{69, 69, 69}的所有内存释放到myArray指向的内存地址,但是

void freeArray ( int * A )
{
     free A;
}

int main ()
{
    int * myArray = (int*)malloc(3*sizeof(int));
    myArray[0] = 69; arr[1] = 69; arr[2] = 69; 
    freeArray(myArray);
    return 0;
}

不会这样做。这让我感到困惑的原因是因为在这两种情况下你都在处理原始指针的副本,但是从该副本中删除指向的对象仅适用于第一种情况。这似乎是一种不一致,但也许我完全错了。有人可以为我清除这个吗?

2 个答案:

答案 0 :(得分:7)

  

也不会这样做。

为什么你这么想?

也许,因为在freeArray(myArray);之后,您可以访问相同的,对吧?

嗯,这是undefined behaviour的结果。

BTW,在你的第一个片段中,

free myArray;

应该是

free(myArray);

答案 1 :(得分:2)

  

根据我的理解,[X]会释放内存地址{69, 69, 69}

中数组myArray的所有内存

右。

  

[Y]不会这样做。

错误。

您的理解不正确。请说明您在哪里阅读,以便我们可以努力在源头纠正这个令人震惊的错误。

[X][Y]也是这样做的。