【问题标题】:Is memory allocated with malloc or calloc deallocated at the end of a function?是否在函数结束时释放了 malloc 或 calloc 分配的内存?
【发布时间】:2015-10-01 07:47:05
【问题描述】:

我将给定类型的指针传递给函数。 在函数中,我分配了所需的内存:

Pointer = (mytype * ) malloc (N* sizeof (mytype));

一切顺利。函数结束后另一个调用指针。

但是之前填充的指针现在没有内存了。

指针不应该保留其填充的内存吗?

或者函数的结束是否会释放内存?

抱歉,我无法粘贴代码,因为我在未连接的 PC 上工作。

【问题讨论】:

  • NO如果不处理,则称为内存泄漏...
  • 如果指针内容没有了,还有一个错误。但没有代码,我们不会知道。
  • 标准免责声明:Don't cast the result of malloc in C.

标签: c pointers dynamic-memory-allocation


【解决方案1】:

没有。 malloc 分配的内存不会在函数结束时释放。

否则,这将是一场灾难,因为您将无法编写一个函数来创建数据结构,方法是为其分配内存、填充数据并将其返回给调用者。

【讨论】:

  • 这正是我的想法,但通过调试我的程序,它似乎......很奇怪
  • @Wing,当内存超出范围时,不要混淆本地句柄(指针)被清理的内存,内存本身被回收。
  • 我编辑了您的答案以使其更清晰。希望我没有改变意思。
【解决方案2】:

不,但您没有将指针返回给调用者。函数内部的参数与调用站点的值不同,因此通过从malloc() 分配返回值来更改它不会更改调用者的值。

这个:

Foo *foo;

AllocateAFoo(foo);

没有机会改变foo 的值函数返回之后,即使参数被分配给函数内部。这就是malloc() 返回新值的原因。

你也需要这样做:

mytype * Allocate(size_t num)
{
  return malloc(num * sizeof (mytype));
}

这意味着从调用者向函数发送未初始化的指针是没有意义的,所以不要。

另外,you shouldn't cast the return value of malloc() in C

另外,您需要注意malloc() 只是一个与其他函数一样的函数。 将如何编写一个在执行离开其他函数时做出反应的函数?答案当然是“你不能”,因此malloc() 也不能。

【讨论】:

    【解决方案3】:

    您可以使用alloca(),但并非所有架构都支持。

    【讨论】:

      猜你喜欢
      • 2014-04-05
      • 1970-01-01
      • 1970-01-01
      • 2020-11-26
      • 2021-06-15
      • 1970-01-01
      • 2014-02-15
      • 1970-01-01
      • 2013-01-04
      相关资源
      最近更新 更多