我应该检查malloc()是否成功?

时间:2014-11-09 18:53:01

标签: c error-handling malloc runtime-error allocation

每个malloc()之后是否应该检查一次是否成功? malloc()是否有可能失败?那么会发生什么?

在学校,我们被告知应该检查,即:

arr = (int) malloc(sizeof(int)*x*y);
if(arr==NULL){
    printf("Error. Allocation was unsuccessful. \n");
    return 1;
}

有什么做法?我可以这样做:

if(!(arr = (int) malloc(sizeof(int)*x*y))
    <error>

2 个答案:

答案 0 :(得分:12)

这主要只是增加了现有的答案,但我知道你来自哪里,如果你做了大量的内存分配,你的代码最终看起来非常难看,因为malloc的所有错误检查。

我个人经常使用一个永远不会失败的小型malloc包装器解决这个问题。除非你的软件是一个有弹性的,安全关键的系统,否则无论如何都无法解决malloc失败的问题所以我会建议这样的事情:

static inline void *MallocOrDie(size_t MemSize)
{
    void *AllocMem = malloc(MemSize);
    /* Some implementations return null on a 0 length alloc,
     * we may as well allow this as it increases compatibility
     * with very few side effects */
    if(!AllocMem && MemSize)
    {
        printf("Could not allocate memory!");
        exit(-1);
    }
    return AllocMem;
}

这至少可以确保您收到错误消息并清除崩溃,并避免大量的错误检查代码。

对于可能失败的函数的更通用的解决方案,我也倾向于实现一个简单的宏,如下所示:

#define PrintDie(...) \
    do \
    { \
    fprintf(stderr, __VA_ARGS__); \
    abort(); \
    } while(0)

然后允许您运行以下函数:

if(-1 == foo()) PrintDie("Oh no");

这为您提供了一个班轮,在启用适当检查的同时又避免了批量生产。

答案 1 :(得分:4)

无需投射malloc()。是的,需要检查malloc()是否成功。 假设malloc()失败并且您正在尝试访问指针,认为内存已分配将导致崩溃。因此,最好在访问指针之前捕获内存分配失败。

int *arr = malloc(sizeof(*arr));
if(arr == NULL)
{
printf("Memory allocation failed");
return;
}