【发布时间】:2017-04-16 07:15:40
【问题描述】:
在我遇到的一堆关于动态内存分配的程序中,当需要分配动态内存时,我总是找到相同的代码:
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);
我想到了它,我想出的唯一一件事是,如果你不能分配新内存是因为堆上没有更多的东西了,所以第二个例子会变成一个 无限循环。那正确吗?因为如果内存分配由于某些其他原因(我真的不知道是哪个原因)失败,那么将分配放在循环中可能会解决问题。
我错过了什么吗?哪种“风格”更受欢迎?
【问题讨论】:
-
第二个例子在失败时确实会变成一个无限循环,而第一个例子会立即退出......你有什么理由更喜欢无限循环而不是立即退出?我不完全确定我理解你的问题......
-
这是否有可能在多线程程序中运行?如果是这样,可以想象线程 1 可能无法分配,因为线程 2 已经抢占了所有空间。如果线程 2 随后释放了它已分配的一些空间,那么线程 1 可能能够获得一些如此释放的内存——然后可能需要重试 malloc,可能在尝试之间有某种暂停,而不是全速锤击分配器。否则(单线程程序),重试没有意义。
标签: c memory memory-management