我正在尝试做一个关于malloc
和内存使用的练习。练习题目是:记忆灾难。在函数中预留一些内存,例如每次100 kb。统计通话次数。这个数字总是一样的吗?我写了这个函数:
int dis_mem(n){
int *mem;
mem = malloc(n * sizeof(int));
if (mem == NULL){
return 0;
}
else
return 1;
}
和一个while循环,我调用函数并打印调用的次数:
int i = 0;
while (dis_mem(25000)){
i++;
}
printf("number of calls %d", i);
但是如果我执行它,几秒钟后终端写入killed
。我正在使用geany和ubuntu 12.04。我哪里错了?
问候。
我理解这个练习只是为了耗尽内存,但即使如此,您也应该尽量不要泄漏内存。每次成功分配一个新块时,都应该将前一个块的地址存储在其中。因此,当您耗尽时,您有一个区块链可以释放。
代码可以是:
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)的VM中测试它,它运行得很好,在运行FreeBSD 10.1的VM中运行CLang 3.4.1 (和没有优化!)。
崩溃原因解释
在过去,我们使用真终端或直接控制台,print
使用的是一个简单的无害呼叫。但是现在,有模拟器,在内存中保存它们显示的东西-在Unix世界中,你会发现xterm和alii,在Windows上的CMD.EXE控制台-如果你已经耗尽了所有的空闲内存,并试图在没有首先释放任何东西的情况下打印消息,你有一个很高的风险,模拟器无法获得足够的内存来存储和处理你发送给它的东西,所以模拟器崩溃你的程序。这就是为什么我自己的版本在打印之前释放所有内存不会崩溃的原因。