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

Pet*_*rba 11 c malloc free exit

这是一段简短的代码片段,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 ? */
    }
Run Code Online (Sandbox Code Playgroud)

提前致谢!

Jen*_*ens 12

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

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

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

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

  • 然后你自己给出了答案:免费()你分配了什么并且不怕考试:-) (2认同)

cni*_*tar 8

在呼唤exit你超越malloc和朋友之后,但操作系统收回了一切.您可以将其malloc视为操作系统与流程之间的便捷中介.