在带有 return + C 的方法中正确使用 free()

use*_*655 3 c malloc free

我的程序中有几个方法,其中有一个 char *str,我对其进行 malloc,然后需要在方法末尾返回 str。我不知道需要在这些方法中放置 free() 语句的位置。如果我在返回 str 之前 free() ,那么 str 是空的,如果我在 return 语句之后执行它,我猜它不会在正确的时间被释放?例如,如果我在释放程序之前退出程序,这将导致内存泄漏。这样做的正确方法是什么?

Phi*_*rry 5

通过阅读您的问题,我认为您对 malloc 和 free 的工作原理有错误的理解。

Malloc 将在进程的堆上分配空间。该堆是全局的,这意味着您可以从代码中的任何位置(而不仅仅是在函数中)访问它。因此,您还可以在代码中的任何位置释放它。如果您返回指向已分配空间的指针,则在同一函数中释放它是没有意义的(否则您将有一个悬空指针,即引用已释放空间的指针)。因此,将指针从函数以外的任何其他地方释放出来是完全可以的(也是必要的)。

此外,正如您所说,进程退出“之后”不会出现内存泄漏。内存泄漏发生在进程内部;意味着进程的某些堆已分配,但不再使用(并且没有对其的引用,因此无法再释放它)。当你的程序在堆上占用大量空间时,这可能会导致内存不足问题(而且这对性能也不利,所以你永远不希望这种情况发生)。然而,当您的进程退出时,操作系统无论如何都会释放它的所有内存(包括堆)。因此,不再有内存泄漏(也许当您处理多线程时除外,但这是另一个主题)。

  • 谢谢你的好解释!你是对的,我还没有完全理解它是如何工作的,但我觉得我现在更了解了:) (2认同)