2

在 C 程序中,如果在程序执行后仍然没有释放动态分配的内存exit(100);,我们会遇到内存泄漏问题吗?例如:

int main (void) {
    char str1[] = "Hello World"
    char *str2;
    str2 = malloc(strlen(str1 + 1));

    if (str2) 
        exit(101); // memory leaks?

    free(str2);
    return 0;
}
4

3 回答 3

4

不是在现代操作系统下,没有。当进程终止时,操作系统会自动收集所有内存。

事实上,如果程序无论如何都退出,释放内存实际上可能对性能有害。原因是调用free有时涉及大量工作——更新大量结构、接触缓存行等。通过简单地退出,您不会做所有这些用户空间的废话,操作系统会负责实际取消映射您的数据。

于 2013-03-19T08:55:27.583 回答
1

使用分配的所有动态分配的内存都malloc需要通过调用显式释放free。当您的程序继续以这种方式运行未分配的内存时,可能会被称为泄漏(前提是它根本没有被使用)。但是,一旦您的程序/进程返回,操作系统就会简单地回收它分配给进程的内存。操作系统不理解泄漏它只是收回它给进程的东西。

于 2013-03-19T08:56:31.433 回答
1

这取决于操作系统。所有现代操作系统(据我所知)在完成执行后都会释放 C 程序未明确释放的内存。因此,在正常情况下,您可以摆脱这种情况而不会产生任何后果。事实上,有一些学派不建议在程序执行即将结束时释放内存,因为这是不必要的。但是,如果您碰巧正在处理可能很危险的旧的或不寻常的操作系统。在其中一些系统中,可能需要重新启动才能再次释放内存。

于 2013-03-19T08:56:51.217 回答