在我遇到的一堆关于动态内存分配的程序中,当需要分配动态内存时,我总是找到相同的代码:
int *pointer = (int *)malloc(sizeof(int));
if(pointer == NULL)
exit(1); // or return 1
// else the program keep running
我想知道为什么它没有被使用,或者至少我从未见过它,类似的东西:
int *pointer
while((pointer = (int *)malloc(sizeof(int)) == NULL);
我仔细考虑了一下,我唯一想到的是,如果你不能分配新内存是因为堆上没有剩余内存,所以第二个例子会变成一个无限循环强>。是对的吗?因为如果内存分配由于某些其他原因(我真的不知道是哪个)而失败,那么将分配放在循环中可能会解决问题。
我错过了什么吗?哪一种“风格”是首选?
最佳答案
我能想到的唯一重试失败的 malloc 的用例是在支持突发来自不同程序的内存分配的环境中运行的程序,所有程序都很快完全释放它。在这种情况下,无法获取所有必要内存的程序应该等到另一个释放足够的内存才能继续。
但这需要程序员非常谨慎,因为有一个直接的极端情况。假设系统有 4 GB 的空闲 内存,也就是没有内存消耗进程正在运行时。假设一个可以获得 1.5GB,还需要 1.5,而另一个也有 1.5GB,还需要 1.5。您处于一个干净整洁的死锁中,因为只有 1 GB 可用并且两个进程都在等待对方释放任何东西。
即使无法获取所有必要内存的进程必须在进入循环之前释放所有内存,您也可能陷入竞争条件,进程只能获取其所需内存的一部分,无法获取所有内存,如果没有,则释放并再次循环如果能够一次全部获取,则进行处理。
由于我们更喜欢健壮的系统,程序会假定内存可用,如果不可用则中止。现在是人类的问题,是选择增加内存更好,还是改变程序让它使用更少的内存,还是序列化处理同时只有一个大程序,还是...
关于c - malloc 返回值作为 while 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40914222/