【问题标题】:Deallocating memory allocated in a function释放函数中分配的内存
【发布时间】:2016-02-13 12:15:20
【问题描述】:

以这段代码为例:

int *doSomething(void) {
    int *something = malloc(sizeof(int));
    return something;
}

int main() {
    int *point = doSomething();
    //code does something...
    free(point);
}

我想知道我是否必须释放在doSomething() 中分配的内存,就像在return something; 之后我必须做free(something); 一样吗?或者做free(point); 也清除something? 或者也许我必须在代码结束之前在main 函数中执行free(something);

【问题讨论】:

  • 我认为最后一个行不通,因为某些东西应该只在 doSomething 函数中“可见”...
  • 您当前的代码是正确的。

标签: c function malloc


【解决方案1】:

不,您不必在doSomething() 中释放内存,free(point) 应该在doSomething() 中释放内存malloc(),前提是指针不递增(涉及指针运算),因为您必须传递给 free() 的指针必须已由 *alloc() 函数之一返回。

您应该注意的是在检查point != NULL 之前访问main() 中的point

注意:当您说 clears 时,您应该知道内存没有被清除,它只是被释放以供再次使用,清除它是不必要且昂贵的。

【讨论】:

  • 好的!所以基本上,如果在代码末尾''something''和''point''仍然有相同的地址,做free(point);在 main 函数上,还将清除在 doSomething 函数中分配的“某物”。我说的对吗?
  • "不,您不必这样做" -- 您应该提及您回答了 OP 的哪个问题。
  • @THZ 是的。正确的。请注意,指针something 将在函数结束后立即删除,但分配的内存段不会。
  • 谢谢你们俩。 :)
  • @THZ 我认为您对指针 variable 和指针持有的 value 感到困惑。重要的是 free 的值,而不是保存该值的实际变量。
【解决方案2】:

根据经验,对malloc 的任何调用都必须在稍后通过对free 的调用来成功。当然,你给free 的参数必须是malloc 的返回值。但是,在您的特定情况下,您已经到达程序的结尾(main 函数的结尾),因此您不必担心该内存,因为无论如何它都会返回给操作系统。调用free 更像是一种迂腐的习惯,这也表明你知道你的程序正在使用什么内存。

当您执行以下操作时,情况会变得更糟:

int *p = malloc(...);
/* do some stuff */
p = malloc(...);

在上面的示例中,第一个 malloc 分配的内存块将永远丢失(也就是只要您的程序运行)。

【讨论】:

  • 虽然这是真的,但我最初担心你是在告诉 OP 不要担心释放内存。如果这不是 main() 函数,那么从长远来看,缺少 free()如果函数不打算返回指针)将是一个严重的问题(如果程序打算长时间运行)。所以这是一个迂腐但非常好的习惯。
  • 确实如此。不过,我并没有说什么假话。导致内存泄漏的不是未释放,而是可达内存,伤害我们的是不可达内存。可访问的、未释放的内存没有任何问题(当然,如果您仍然需要它)。
  • 现实世界的环境中,从main() 返回不会释放内存。并非每个人都使用在进程后进行清理的操作系统。从长远来看,依赖主机系统清理内存的程序员会遇到麻烦——例如,当将代码移动到重复分配内存但从不释放内存的函数中时。
  • 我同意,如果你不明确地free 内存,你可能会导致更多问题,但我认为人们过于字面意思,根本不过滤信息,只要相信他们发现的任何东西在谷歌显示的第一个链接上。我认为即使作为 C 新手,了解内存实际发生的情况也很重要。此外,它不是从 main 返回导致内存被释放的原因,根本不是。它正在完成该过程并从物理内存中取消映射其页面(由操作系统完成的操作)。
猜你喜欢
  • 2012-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-09
  • 1970-01-01
  • 2011-05-13
  • 1970-01-01
相关资源
最近更新 更多