在_SUCCESS和_FAILURE上退出()释放分配的内存

这是一段简短的代码片段,如果失败则会有两次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 ? */ } 

提前致谢!

是的,返回所有内存。 顺便说一下,退出之后你还想用剩余的内存做什么呢?
或者您是否担心exit()的内存泄漏? 如果内存没有被回收,那么每次退出过程都会泄漏更多内容,这是操作系统无法承受的。 因此,除了有缺陷的操作系统外,不要再担心内存并在任何需要的地方使用exit()

要回答代码注释中的问题,是否要释放,我会说适当的软件工程是为每个malloc写一个相应的free软件。 如果看起来很难,则表明代码中存在结构性问题。 在退出之前释放所有内存的好处是,您可以使用像valgrind这样的强大工具来检查代码中其余代码的内存泄漏, 而不会出现您向我们展示的malloc的误报

请注意,在malloc 失败后,尝试释放结果没有意义 – 无论如何它都是空指针。

第三,我更喜欢if (pointer == NULL) over if (!pointer)但这完全是主观的,我可以阅读并理解两者:-)

在调用exit你超越了malloc和朋友,但操作系统收回了所有内容。 将malloc视为操作系统和流程之间的便捷中介。

只需要注意,在那两个退出调用的情况下 – 你没有分配任何内存,因此释放该指针将毫无意义(并且可能会崩溃,具体取决于C运行时系统的年龄)。

所以,不,你不应该释放它,因为它不存在。

我已经说过像这样的致命错误,你可能不想打扰释放内存。

但是,如果您的程序正常退出,是的,您应该尝试释放已分配的所有内存。 这有时候非常棘手。

退出程序时,操作系统(堆栈和堆)都会回收所有已分配的内存。 您的程序不会在RAM中留下任何空白,除非您通过缓冲区溢出等工作在程序的内存之外。