gpt4 book ai didi

c - malloc() 在无限循环中

转载 作者:太空宇宙 更新时间:2023-11-04 07:30:44 24 4
gpt4 key购买 nike

我有一个面试问题,当我们在无限循环中使用 malloc() 分配大块内存并且不 free() 时会发生什么。

我想用 NULL 检查条件应该在堆上没有足够的内存时工作并且它应该打破循环,但它没有发生并且程序通过打印 异常终止杀死

为什么会发生这种情况,为什么在没有内存可分配时(我的意思是 malloc() 失败时)它不执行 if 部分?这是什么行为?

我的代码是:

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

int main(void) {
int *px;

while(1)
{
px = malloc(sizeof(int)*1024*1024);
if (px == NULL)
{
printf("Heap Full .. Cannot allocate memory \n");
break;
}
else
printf("Allocated \t");
}
return 0;
}

编辑:gcc - 4.5.2 (Linux- Ubuntu -11.04)

最佳答案

如果您在 Linux 上运行,请留意第一个终端。它将显示如下内容:

OOM error - killing proc 1100

OOM 表示内存不足。

我认为它在 dmesg 和/或 /var/log/messages 和/或 /var/log/system 中也可见,具体取决于在 Linux 发行版上。你可以用 grep:

grep -i oom /var/log/*

你可以让你的程序慢慢地获取内存,并留意:

watch free -m

您会看到可用的交换越来越少。当它接近于零时,Linux 将终止您的程序,并且可用内存量将再次增加。

这是一个很好的解释 free -m 输出的链接:http://www.linuxatemyram.com/


此行为可能是启动我的 init 或其他一些保护机制(如“上帝”)的应用程序的问题,您可能会进入一个循环,其中 linux 终止应用程序并 init 或其他东西再次启动它。如果所需内存量远大于可用 RAM,则可能会通过将内存页交换到磁盘而导致运行缓慢。

在某些情况下,linux 不会终止导致问题的程序,而是终止其他一些进程。例如,如果它杀死了 init,机器将重新启动。

在最坏的情况下,一个程序或一组进程将请求大量内存(超过 Ram 中可用的内存)并尝试反复访问它。 Linux 无法快速放置该内存,因此它必须将 Ram 的一些页面换出到磁盘(交换分区)并从磁盘加载正在访问的页面,以便程序可以查看/编辑它。

这种情况每毫秒都会重复发生。由于磁盘比 RAM 慢 1000 倍,这个问题可能会使机器几乎停止运行。

关于c - malloc() 在无限循环中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13921053/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com