关于C动态内存分配的练习

时间:2015-07-25 10:17:37

标签: c malloc kill-process

我正在尝试对malloc和内存使用情况进行练习。 演习的内容是:记忆灾难。在函数中保留一些内存,例如每次100 KB。计算通话次数。这个数字总是一样的吗? 我写了这个函数:

int dis_mem(n){
    int *mem;
    mem = malloc(n * sizeof(int));
    if (mem == NULL){
        return 0;
    }
    else
        return 1;
}

并且使用了一段时间,我调用了该函数并打印了调用次数:

int i = 0;
while (dis_mem(25000)){ 
    i++;
}
printf("number of calls %d", i);

但如果我执行它,几秒钟后终端就会写killed。我在ubuntu 12.04上使用了geany。 哪里错了?

问候。

1 个答案:

答案 0 :(得分:0)

我知道这个练习只是为了耗尽内存,但即便如此,你也应该尽量不泄漏内存。每次成功分配新块时,都应将前一个块的地址存储到其中。所以当你筋疲力尽时,你就会有一系列的块来解除分配。

代码可以是:

int dis_mem(n){
    void  **mem;
    void **last = NULL;
    mem = malloc(n * sizeof(void *));
    if (mem == NULL){
        while (last != NULL) {
            mem = *last;
            free(last);
            last = mem;
        }
        return 0;
    }
    else {
        *mem = last;
        last = mem;
        return 1;
    }
}

这样,C标准库的正确实现不应该崩溃。

我可以在运行Windows XP(MSVC 2008)的虚拟机中对其进行测试,运行良好,在使用CLang 3.4.1(且无优化!)运行FreeBSD 10.1的虚拟机中运行相同。 / p>

解释崩溃

在过去,我们使用真正的终端或直接控制台,print用来做一个简单的无害呼叫。但现在,有一些模拟器,它们在内存中保存它们显示的内容 - 在Unix世界中,你会发现xterm和alii,在Windows上的CMD.EXE控制台 - 如果你已经用尽所有可用内存并尝试在没有第一次打印的情况下释放任何东西,你有很高的风险,模拟器无法获得足够的内存来存储和处理你发送给它的内容,因此模拟器会崩溃你的程序。这就是为什么我自己的版本在打印之前释放所有内存不会崩溃的原因。