这是一个简短的代码片段,在失败的情况下有两个对exit(3)
的调用。这些调用会释放malloc分配的内存吗?谷歌搜索曾经说过它会,但更多时候,它不会。。。
我应该添加free()吗?
还有:if (!word)
(它也适用于例如单词==0,这与单词==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 ? */
}
提前感谢!
是的,返回所有内存。顺便说一句,在退出后,你想对剩余的内存做什么
或者您担心exit()
内存泄漏?如果不回收内存,每个退出的进程都会有更多的内存泄漏,这是任何可信的操作系统都无法承受的。所以,除了一个有缺陷的操作系统,别再担心内存了,只要你需要,就用exit()
为了回答代码注释中的问题,是否免费,我认为用每个malloc
编写相应的free
是合适的软件工程。如果这看起来很难,那就表明代码中存在结构问题。在退出之前释放所有内存的好处是,您可以使用像valgrind这样强大的工具来检查代码剩余部分的内存泄漏,而不会从您向我们展示的malloc中出现误报。
请注意,在失败malloc之后,尝试释放结果是没有意义的——无论如何,它都是一个空指针。
第三,我更喜欢if (pointer == NULL)
而不是if (!pointer)
,但这完全是主观的,我可以阅读和理解:-)
调用exit
后,您超越了malloc
和朋友,但操作系统收回了所有内容。将malloc
视为操作系统和进程之间的方便中介。
请注意,在那两次退出调用中,您没有分配任何内存,因此释放指针将毫无意义(并且可能会崩溃,具体取决于您的C运行时系统的使用年限)。
所以,不,你不应该释放它,因为它不存在。
我想说的是,在发生这样的致命错误的情况下,你可能不想麻烦释放内存。
但是,如果您的程序正常退出,是的,您应该尝试释放所有分配的内存。这有时可能相当棘手。
退出程序时,操作系统(堆栈和堆)会回收所有分配的内存。您的程序不会在RAM中留下任何足迹,除非您通过缓冲区溢出等方式在程序的内存之外工作。