我可以在失败时循环malloc吗?

时间:2014-08-12 10:02:12

标签: c memory-management

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

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

请记住,这是从已分叉的子进程运行的。当程序全面展开时,我将拥有尽可能多的子进程。所以我的逻辑是,如果我在调用malloc时没有内存,可以暂停一段时间让其他进程有机会自由调用,然后再试一次。

在我遇到内存不足的情况之前,我自己无法真正测试这个,但这个概念会有效吗?

2 个答案:

答案 0 :(得分:2)

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

现在很多软件都是64位。这意味着在实践中,malloc将从不失败,除非你的大小参数是荒谬的错误,比如未初始化的变量,或者(size_t)-1恰好是大约170亿千兆字节。如果超出可用RAM,您的应用程序将开始像疯了一样进行交换,并且在某些时候用户不能再慢了并且杀死您的应用程序。因此,即使检查malloc故障通常也是没有意义的,只要你确保你的应用程序崩溃,如果它失败并且出于安全原因不会做愚蠢的事情。

作为严肃使用此方法的代码示例,请使用MacOS X / iOS代码,其中许多基本功能无法在内存不足时通知您。

现在,如果您遇到无法找到内存来分配小数据包的情况,那么整个应用程序存活的可能性和执行任何有意义的操作的可能性是多少?零?

答案 1 :(得分:0)

通常,当无法满足内存请求时会发生malloc故障,因为没有可用的内存块。虽然malloc完全取决于具体情况,但可以解决问题。

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

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