如果程序即将退出,释放分配的内存真的很重要吗?

问题描述:

我明白,如果你正在分配内存来临时存储某些东西,请说出对用户操作的回应,当代码再次到达那一点时,你不再需要内存了,你应该释放内存它不会导致泄漏。在这种不明朗的情况下,这里是它的免费存储重要的,当我知道一个例子:如果程序即将退出,释放分配的内存真的很重要吗?

#include <stdio.h> 
#include <stdlib.h> 

void countToNumber(int n) 
{ 
    int *numbers = malloc(sizeof(int) * n); 

    int i; 
    for (i=0; i<n; i++) { 
     numbers[i] = i+1; 
    } 
    for (i=0; i<n; i++) { 
     // Yes, simply using "i+1" instead of "numbers[i]" in the printf would make the array unnecessary. 
     // But the point of the example is using malloc/free, so pretend it makes sense to use one here. 
     printf("%d ", numbers[i]); 
    } 
    putchar('\n'); 

    free(numbers); // Freeing is absolutely necessary here; this function could be called any number of times. 
} 

int main(int argc, char *argv[]) 
{ 
    puts("Enter a number to count to that number."); 
    puts("Entering zero or a negative number will quit the program."); 

    int n; 
    while (scanf("%d", &n), n > 0) { 
     countToNumber(n); 
    } 

    return 0; 
} 

但是,有时候,我需要为程序运行的整个时间内存和即使我为了相同的目的而最终分配更多数据,存储在先前分配的存储器中的数据仍在使用中。因此,只有在程序退出之前,我才最终需要释放内存。

但是,如果我不最终释放内存,会真的导致内存泄漏?我认为只要进程退出,操作系统就会回收内存。即使它不会导致内存泄漏,是否还有另一个解释内存非常重要的原因,前提是这不是C++,并且没有需要调用的析构函数?

例如,在下面的例子中是否需要调用free

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) 
{ 
    void *ptr = malloc(1024); 
    // do something with ptr 
    free(ptr); 
    return 0; 
} 

在这种情况下,free是不是真的不方便,但是在我的动态包含指向其他动态分配数据结构分配内存的情况下,这将是很高兴知道我不不需要建立一个循环来完成它。特别是如果结构体中的指针指向具有相同结构的对象,并且我需要递归删除它们。

+2

是的,因为你的程序会随着时间而改变,你会忘记这个破解 – amdixon

+0

请参阅http://*.com/questions/654754/what-really-happens-when-you-dont-free-after- malloc – hazzelnuttie

+1

适当的资源所有权规则是*理解*如何构建系统的一部分。你的问题可能是“我真的需要了解我在做什么,如果它只是简单的事情”。 –

一般来说,操作系统会回收内存,所以不行,你不要free()吧。但是这样做确实是一个很好的做法,在某些情况下,它实际上可能会有所作为。几个例子:

  • 你执行你的程序作为另一个进程的子进程。根据完成的方式(见下面的注释),内存不会被释放,直到父节点完成。如果父母永远不会结束,那是永久的泄漏。
  • 你改变你的程序做别的事情。现在你需要追踪每条出口路径并释放一切,你可能会忘记一些。
  • 回收内存是OS的意志。所有主要的人都这样做,但是如果你将程序移植到另一个系统,它可能不会。
  • 静态分析和调试工具使用正确的代码可以更好地工作。
  • 如果内存在进程之间共享,则只能在所有进程终止之后释放内存,或者甚至可能不会。

顺便说一句,这只是关于内存。释放其他资源(如关闭文件(fclose()))更重要,因为某些操作系统(Windows)未正确刷新流。

+0

不错,但对于最后的声明:**释放其他资源,如关闭文件(fclose())更重要。**,在程序终止前关闭所有打开的文件 –

+0

@AlterMann是,但写入的任何数据它不会被刷新。尝试打开一个文件进行写入,写入一些字节,然后退出而不关闭(或'fflush()')。你最终会得到一个空文件。 – mtijanic

+3

@mitjanic:nops,(C99,7.19.3p5)“如果主函数返回到其原始调用者,或者调用了exit函数,则在程序终止之前,所有打开的文件都会关闭(因此所有输出流都会刷新)。 –