C 为什么您可以释放/删除返回的对象,但您可以';t是否释放/删除通过参数输入的对象?

C 为什么您可以释放/删除返回的对象,但您可以';t是否释放/删除通过参数输入的对象?,c,memory-management,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指向

据我了解,

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;
}
我不会这么做。这让我感到困惑的原因是,在这两种情况下,您都在处理原始指针的副本,但从该副本中删除指向对象仅在第一种情况下有效。这似乎前后矛盾,但也许我完全错了。有人能帮我澄清一下吗

我不会这么做

你为什么这么想

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

好吧,这是一个结果

顺便说一句,在你的第一个片段中

free myArray;
应该是

free(myArray);
据我所知,
[X]
将释放位于内存地址
myArray

但是
[Y]
不会这样做

你的理解是错误的。请说明您在哪里读到的,以便我们努力从源头上纠正这一严重错误


[X]
[Y]
做同样的事情。

是什么让你认为它做不到同样的事情?另外警告:在
malloc
中调用
sizeof
(及类似内容)时,作为
ptr=malloc(sizeof(*ptr)*…)而不是
ptr=malloc(sizeof(ptrtype*)*…)。第二个警告:您需要返回malloc。请首先使代码实际可编译<代码>释放A
?@Eregrith:OP犯了用两种不同语言标记的错误。你的评论完全适用于C,但是下半部分在C++中是错误的(不是你的问题,而是OP的)。此外,我倾向于避免使用
sizeof
中的括号,它不是值所需的,而是类型所需的。如果在代码中我看到括号,我将其删除,它要么生成,要么必须更改
ptr=malloc(sizeof*ptr*…)
@firedfromfrommicrosoft ough…请……别这么说。他们是两种不同的语言,这样对待他们更好。只使用相同类型的语法不会使两种语言成为-PAR.在C++中,不应该混合“新”/“Malc”和“DeleDe//Field.”。在某些平台上,对于某些数据类型,它们的行为会有所不同,并且会出现奇怪的行为。在整个程序中只使用一个是最安全的?(我认为这是一种未定义的行为。)确实如此。他的意思是
delete[]myArray
。这是一个特别有趣的错误,因为有时候
delete myArray
似乎会起作用。