2016-11-06 47 views
1

以为我是为了有一个字符串设定为指针,如:在结束程序之前需要做一个自由的(字符串)吗?

char *string = NULL; 
size_t size = 0; 
getline(&string, &size, stdin); 

有必要做一个free(string)年底前计划? 正如我在男士中看到的,getline呼叫malloc(),我曾假设它。

+0

这不是必要的,但是可取的。稍后您可能需要重构它,并且在自身更容易放置在不同的上下文中后进行清理的代码。 – PSkocik

+1

我也清理,以便Valgrind给我一个零泄漏的报告。如果我有零泄漏,我不必担心特定泄漏是否有害(增长)或相对无害。 – PSkocik

回答

4

为了确保您的软件没有任何内存泄漏,是的,您应该为您动态分配的任何内存调用free

当进程终止时,内存将被操作系统回收,除非可用内存不足,否则它并不重要。但是,如果编写将在后台运行的软件(如守护进程),则使用free释放内存非常重要。

建议(几乎普遍)正确的方法(tm)是free您的记忆,而不是依靠操作系统来回收该空间。

+0

“在现代操作系统中......”现代与否,它是一样的。 C不需要程序明确释放内存。所有C程序在退出时都会释放内存。 –

+0

哦,我不知道。用C编写的程序不可能从内核请求内存(一个小的嵌入式内核,就像我在我的计算机组织类中写的那样),然后终止而不告诉内核它不再需要该空间,因此即使程序终止后也会导致内存泄漏?我想这可能被称为坏内核,但原则上似乎不可能。 –

+1

@JohnKugelman并非普遍真实 - VxWorks等操作系统 - 一个非常常用的RTOS(可能仍然是?)单进程,多线程和动态链接加载的程序(几乎没有内存保护) 。许多竞争对手都使用了类似的模式。程序泄漏的内存没有清理。它没有违反C标准,因为只有一个'main()'。 – marko

-1

这是没有必要的。

有一些很好的理由,如另一个答案中所述。但也有一些原因不是:执行释放的代码需要额外的时间来编写,调试和维护,并且是一个额外的潜在错误源。

这是不可能的,你应该或不应该给出一个普遍的答案:这是每个项目必须根据自己的情况作出的选择。

相关问题