【发布时间】:2015-07-16 14:03:40
【问题描述】:
据我了解,
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;
}
会在myArray指向的内存地址释放数组{69, 69, 69}的所有内存,但是
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;
}
不会这样做。这让我感到困惑的原因是,在这两种情况下,您都在处理原始指针的副本,但从该副本中删除指向的对象仅适用于第一种情况。这似乎是不一致的,但也许我完全错了。有人可以帮我解决这个问题吗?
【问题讨论】:
-
是什么让你认为它没有做同样的事情?另外警告:当在
malloc(等)you should always write it 中调用sizeof为ptr = malloc(sizeof(*ptr) * ...);而不是ptr = malloc(sizeof(ptrtype*) * ...);。第二个警告:你should not cast malloc 的返回。 -
首先让您的代码真正可编译。
free A? -
@Eregrith:OP 错误地使用了两种不同的语言进行标记。您的评论完全适用于 C,但后半部分在 C++ 中是错误的(不是您的问题,而是 OP 的问题)。另外,我倾向于避免
sizeof中的括号,因为值不需要,但类型需要。如果在代码中我看到括号,我删除它们,它要么构建,要么必须更改。ptr = malloc( sizeof *ptr * ... ) -
@FiredfromMicrosoft 呃...请..不要这么说。它们是两种不同的语言,这样处理更好。仅具有相同类型的 语法 不 使两种语言 at-par。
-
在 C++ 中,您不应该混合使用“new”/“malloc”和“delete”/“free”。在某些平台上,对于某些数据类型,它们的行为不同,您会得到奇怪的行为。在整个程序中只使用一个是最安全的。
标签: c memory-management