如果malloc失败怎么办?

sam*_*m32 21 c memory malloc

如果malloc分配失败,我们应该再试一次吗?

在这样的事情:

char* mystrdup(const char *s)  
{
    char *ab = NULL;

    while(ab == NULL) {
        ab=(char*)malloc(strlen(s)+1);  
    }

    strcpy(ab, s);
    return ab;
}
Run Code Online (Sandbox Code Playgroud)

while循环对检查内存分配有效吗?

Ern*_*ill 27

一般来说,现代malloc()实现NULL只会作为绝对的最后手段返回,再次尝试肯定无济于事.唯一有用的就是释放一些记忆,然后再试一次.如果您的应用程序拥有任何可消耗的资源,那么这将是释放它们的时间,然后再给它一次.

在某些环境中,一种有用的做法是将少量内存分配为雨天基金.如果malloc()永远返回NULL,即可免费阴雨天的基金,然后分配任何你需要的资源,能够处理错误,并优雅地退出.使用旧的Macintosh Toolbox编程时,这是一种常见的做法; 如果malloc()返回NULL,您可以使用该空间创建一个对话框,以在退出之前报告问题.


AnT*_*AnT 8

在单线程程序中"再次尝试"而不会在尝试之间释放任何内存,这没有任何实际意义.它将永远循环.

在一个多线程程序中,如果另一个并行运行的线程突然决定释放它自己的一些内存,这可能会"起作用".在这种情况下的循环将构成经典的"忙碌等待"循环.但是即使在这种情况下,这样的代码由于更多原因而没有实际价值.

  • 即使在单线程程序中,如果失败的原因是系统上的总内存耗尽而不仅仅是每个进程限制(例如虚拟地址空间的大小或"setrlimit"限制),它也可能有意义. (4认同)

tbe*_*ert 2

这不太可能达到您想要的效果;如果您的内存不足,则忙循环直到获得更多内存可能会令人失望。您应该将 NULL 返回给调用程序,以便它可以通过释放不再需要的内存或返回错误来处理资源耗尽问题。