我可以将malloc放入do ... while块以确保成功分配吗?
喜欢:
#define STR_SIZE 1024 * 1024
char *str;
do
str = (char *) malloc(STR_SIZE);
while ( !str );
Run Code Online (Sandbox Code Playgroud)
它可能不起作用,因为malloc很少失败,它在资源耗尽时失败,并且这些将很快无法使用.
唯一malloc能够获得更多资源的常见情况是,如果其他一些大进程释放了大量内存,那很少发生并且可能永远不会发生; 如果你关心sleep在你的循环中添加至少一个,并准备好处理malloc真正失败并永远返回的情况NULL.
更好的做法是测试malloc结果并退出失败和错误消息,例如
char* str = malloc(STR_SIZE);
if (!str) {
perror("malloc failed for str");
exit (EXIT_FAILURE);
}
Run Code Online (Sandbox Code Playgroud)
并且每个程序都应该在malloc失败时处理这种情况(通常通过退出并显示错误消息).
许多程序在失败时调用-s或-s xmalloc函数,并在成功时返回分配的区域exitabortmalloc
使用malloc故障(即能够继续执行的事情)明智地处理非常困难.有些程序可能是free其他一些全球数据.实际上,这相当于实现了一些专门的垃圾收集机制.某些服务器可能只是失败当前请求(并且应该非常谨慎地执行此操作,释放当前失败请求使用的所有资源).
而malloc能真正失败,当你需要更多的资源,那些可用.所以你必须处理这个案子.
顺便说一句,你可以考虑使用贝姆保守的垃圾收集和使用GC_malloc,而不是malloc不关心它的失败和对free-ing.(我认为当没有足够的内存时,Boehm的GC会中止该程序).