【问题标题】:Why can you free/delete an object that was returned, but you can't free/delete an object that was entered through a parameter?为什么可以释放/删除返回的对象,却不能释放/删除通过参数输入的对象?
【发布时间】: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 中调用sizeofptr = 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


【解决方案1】:

不会这样做。

你为什么会这样想?

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

嗯,这是undefined behaviour 的结果。

顺便说一句,在你的第一个 sn-p 中,

free myArray;

应该是

free(myArray);

【讨论】:

  • 或者 OP 的意思是 delete myArray; ? (我认为这是未定义的行为。)
  • 确实会。他的意思是delete[] myArray。这是一个特别有趣的错误,因为有时delete myArray 似乎会起作用。
【解决方案2】:

据我了解,[X] 将在内存地址myArray 处释放数组{69, 69, 69} 的所有内存

没错。

[Y] 不会这样做。

错了。

你的理解不正确。请指出您在哪里阅读该内容,以便我们努力从源头纠正这一严重错误。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-10
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    • 2011-11-18
    相关资源
    最近更新 更多