繁体   English   中英

失败时可以循环malloc吗?

[英]can I loop malloc on failure?

我正在做一些网络C代码,如果内存不足,也不想退出程序,也不想忽略他发送给我的客户数据。 所以我想我会做这样的事情

while(1){
    client_packet = (struct packet_data *)malloc(size);
    if(client_packet != NULL){
        break;
    }
    if(errno == ENOMEM){
        sleep(1);
        continue;
    }else{
        return;
    }
}

请记住,这是从分叉的子进程运行的。 当程序全面展开时,我将拥有尽可能多的子进程。 因此,我的逻辑是,如果我在调用malloc时没有内存,请睡一秒钟,让其他进程有机会调用free,然后重试。

在遇到内存用尽的情况之前,我无法真正进行自我测试,但是这个概念有效吗?

这取决于您使用的计算机和操作系统,但是通常这只是毫无意义的。

如今,许多软件都是64位的。 实际上,这意味着malloc 永远不会失败,除非您的size参数非常可笑,例如未初始化的变量,或者(size_t)-1恰好约为170亿兆字节。 发生的情况是,如果您超过可用的RAM,您的应用程序将开始疯狂地进行交换,并且在某些时候,用户再也无法忍受缓慢并杀死您的应用程序。 因此,即使检查malloc失败通常也是没有意义的,只要确保您的应用程序崩溃(出于安全原因)并且不会因执行愚蠢的事情而崩溃。

作为认真使用此方法的代码示例,请使用MacOS X / iOS代码,其中许多基本功能无法通知您是否耗尽了内存。

现在,如果您遇到无法找到分配小数据包的内存的情况,那么作为一个整体,应用程序幸存下来并做有意义的事情的机会是多少? 零?

通常,当由于没有可用的内存块而无法满足内存请求时,发生malloc失败。 尽管完全取决于特定情况,但malloc循环可以解决该问题。

例如,您的计算机上同时运行两个进程,第一个进程请求过多的动态内存,导致第二个进程malloc()失败。 在第二个进程中循环使用malloc()时,第一个进程开始通过free()释放它们分配的内存(该操作在OS调度程序中经常在进程之间切换),现在第二个进程中的malloc()将返回成功指针。

但是,我认为此实现不是一个好主意,因为此循环可能会永远阻塞。 此外,像这样的循环消耗CPU资源。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM