12

这是一小段代码,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 ? */
    }

提前致谢!

4

4 回答 4

17

是的,所有的内存都被退回了。顺便说一句,无论如何,您想在退出后如何处理剩余内存?
还是您担心内存泄漏exit()?如果内存没有被回收,它会随着每个退出进程泄漏更多,这是任何可靠的操作系统都无法承受的。所以,除了一个有问题的操作系统,别再担心内存了,exit()在你需要的地方使用它。

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

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

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

于 2012-08-23T13:30:10.873 回答
8

打电话给exit你之后,你已经超越了malloc朋友,但操作系统收回了一切。将malloc其视为操作系统和您的进程之间的便捷中介。

于 2012-08-23T13:25:06.077 回答
3

请注意,在这 2 次 exit 调用中,您没有分配任何内存,因此释放该指针将毫无意义(并且可能会崩溃,具体取决于您的 C 运行时系统的年龄)。

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

我会说,如果发生这样的致命错误,您可能不想费心释放内存。

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

于 2012-08-23T14:20:53.420 回答
1

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

于 2012-08-23T13:31:23.257 回答