malloc in do while block

Lea*_*jon 1 c malloc

我可以将malloc放入do ... while块以确保成功分配吗?

喜欢:

#define STR_SIZE 1024 * 1024
char *str;
do
    str = (char *) malloc(STR_SIZE);
while ( !str );
Run Code Online (Sandbox Code Playgroud)

Bas*_*tch 8

它可能不起作用,因为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会中止该程序).