在一堆关于动态内存分配的程序中,当需要分配动态内存时,我总能找到相同的代码位置:
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的唯一用例是一个运行在支持不同程序的内存分配突发的环境中的程序,所有这些程序都很快就会完全释放它。在这种情况下,一个无法获得所有必要内存的程序应该等到另一个程序释放足够的内存才能继续。
但这将需要程序员非常谨慎,因为有一个直接的角落情况。假设系统有4gb的空闲内存,也就是说,没有一个内存消耗进程在运行。假设一个可以得到1.5GB,需要1.5个以上,而另一个也有1.5GB,也需要1.5个以上。由于只有1 GB可用,并且两个进程都在等待另一个进程释放任何内容,因此您处于一个良好且干净的死锁中。
即使一个不能获取所有必需内存的进程在进入循环之前必须释放所有内存,您也可能陷入这样的竞争状态:进程只获取其所需的部分内存,不能获取全部内存,如果没有进程能够一次获取全部内存,则释放并再次循环。
由于我们更喜欢健壮的系统,程序假设内存是可用的,如果不可用就中止。现在的问题是,一个人应该选择是添加内存,更改程序以使其使用更少的内存,还是序列化处理以同时只有一个大程序,或者。。。