这是一段简短的代码,在发生故障时会调用exit(3)
两次。
这些调用是否释放malloc分配的内存?谷歌搜索曾经说过它,甚至更多次,它没有......
我应该添加free()吗?
另外:哪个更好if (!word)
(它也适用于例如.word == 0,这与word == NULL不同,所以我猜它是错误的)或if (word == NULL)
?
char *word = NULL, *temp = NULL;
word = (char *)malloc(sizeof(char) * size);
if (!word) { /* or maybe rather it should be (word == NULL) */
perror("malloc fail");
if (fclose(fp)) {
perror("fclose fail");
exit(3); /* exit without free ? */
}
exit(3); /* exit without free ? */
}
提前致谢!
答案 0 :(得分:10)
是的,返回所有内存。顺便说一下,退出之后你还想用剩余的内存做什么呢?
或者您是否担心exit()
中的内存泄漏?如果内存没有被回收,那么每次退出过程都会泄漏一点,这是操作系统无法承受的。因此,除了有缺陷的操作系统之外,不要再担心内存并在任何需要的地方使用exit()
。
要回答代码评论中的问题,是否免费,我会说每个free
编写一个相应的malloc
是合适的软件工程。如果这看起来很难,则表明代码中存在结构性问题。在退出之前释放所有内存的好处是,您可以使用像valgrind这样的强大工具来检查代码的其余部分中的内存泄漏,而不会从您向我们展示的malloc中发现误报。
请注意,在失败 malloc之后,没有必要尝试释放结果 - 无论如何它都是空指针。
第三,我更喜欢if (pointer == NULL)
而不是if (!pointer)
,但这完全是主观的,我可以阅读并理解两者: - )
答案 1 :(得分:8)
在致电exit
之后,您已超越malloc
和朋友,但操作系统会回收所有内容。将malloc
视为操作系统与流程之间的便捷中介。
答案 2 :(得分:3)
请注意,在那两个退出的调用中,你没有分配任何内存,因此释放该指针将毫无意义(并且可能会崩溃,具体取决于C运行时系统的年龄)。
所以,不,你不应该释放它,因为它不存在。
我已经说过像这样的致命错误,你可能不想打扰释放内存。
但是,如果您的程序正常退出,是的,您应该尝试释放已分配的所有内存。这有时候非常棘手。
答案 3 :(得分:1)
退出程序时,OS(堆栈和堆)都会回收所有已分配的内存。你的程序不会在RAM中留下任何空白,除非你通过缓冲区溢出等工作在程序的内存之外。