使用Ctrl-C中断程序时如何释放动态分配的空间?

时间:2011-09-01 22:48:38

标签: c++ c memory-management

给出以下代码:

#include <stdio.h>

int main()
{
    int *p;
    p = (int *)malloc(10 * sizeof(int));

    while(1);
    return 0;
}

当编译并运行上面的代码,并且在执行时通过按 Ctrl + C 中断代码时,如何释放分配给p的内存?这里的操作系统有什么作用?它与C ++的情况有何不同,使用new运算符?

4 个答案:

答案 0 :(得分:13)

当进程终止时,操作系统将回收进程正在使用的所有内存。

即使操作系统收回你的应用程序在终止时使用的内存,人们会因为内存泄漏而造成大量内存泄漏的原因是,通常非重要的应用程序会长时间运行,慢慢吞噬所有内存系统。对于寿命很短的程序来说,这不是一个问题。 (但你永远无法分辨一个单行程何时会成为一个庞大的程序,所以即使在小程序中也不会有任何内存泄漏。)

答案 1 :(得分:3)

顺便说一句(除了Seth Carnegie说):

使用<signal.h>中的例程,您可以捕获SIGINT信号(中断)以任何方式处理 Ctrl + C ,例如清理任何重要资源,不仅是内存(如关闭文件,从而避免丢失任何缓冲和尚未写入的内容,或轻轻关闭网络连接)。

答案 2 :(得分:0)

_exit的完整说明如下:

http://pubs.opengroup.org/onlinepubs/9699919799/functions/_Exit.html

当一个过程因致命信号而终止时,会发生同样的事情。

答案 3 :(得分:0)

内存实际上并非“free()”d。

操作系统获取的内存是页面大小(通常是4kbytes的内存)。每当进程耗尽内存时,它就会获取额外的页面,这些是malloc()实际使用的空间。当进程终止时,所有页面都返回到操作系统,使得实际上不需要调用。如果你的程序是一个服务器或类似的程序,那么永远不会被释放的每一块内存只会在程序被实际杀死时返回 - 这使得每个内存都需要更多内存。