gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:48:06 25 4
gpt4 key购买 nike

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

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

请记住,这是从已 fork 的子进程运行的。当程序如火如荼时,我将拥有尽可能多的子进程。所以我的逻辑是,如果我在调用 malloc 时没有内存,可能会休眠一秒钟,让其他进程有机会调用 free,然后重试。

在遇到可能会耗尽内存的情况之前,我无法真正亲自测试它,但是这个概念是否有效?

最佳答案

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

现在很多软件都是 64 位的。这意味着实际上 malloc 永远不会 失败,除非您的大小参数错误得离谱,例如未初始化的变量,或者 (size_t) -1 恰好是大约 170 亿千兆字节。发生的情况是,如果您超过可用 RAM,您的应用程序将开始疯狂交换,并且在某个时候用户无法再忍受缓慢并终止您的应用程序。因此,出于安全原因,只要您确保应用程序在失败时崩溃并且不会继续做愚蠢的事情,即使检查 malloc 失败也通常毫无意义。

作为认真使用这种方法的代码示例,以 MacOS X/iOS 代码为例,其中许多基本功能在内存不足时无法通知您。

现在,如果您遇到找不到内存来分配一个小数据包的情况,那么整个应用程序在这种情况下幸存下来并做任何有意义的事情的机会有多大?零?

关于我可以在失败时循环 malloc 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25261490/

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