有没有理由在malloc之后不能将null检查变成函数?

时间:2015-04-07 20:50:57

标签: c syntax malloc

C我们使用malloc系列函数时,我们应该添加一个条件来检查分配是否成功,如果没有,则打印一条消息。

如果我的代码中有很多分配,有什么理由说我不能将它作为一个功能吗?即:

void nullcheck(void * x){
    if (x == NULL){
        printf("Memory allocation has failed");
        exit(1);
    }
}

并调用函数:

int * a = malloc(sizeof(int));
nullcheck(a);

它使代码更好更短,是否有任何理由不应该这样做?

4 个答案:

答案 0 :(得分:4)

  

是否有任何理由不应该这样做?

如果您的应用程序能够在分配失败后立即退出,那么请务必将其作为一个函数,并将其合并到分配函数中。

如果您正在编写需要比其更好的代码(例如库),则无法执行此操作,因为通常必须在释放已成功分配的任何内容后返回错误代码。

在后一种情况下,模式看起来像:

p1 = malloc(…);
if (!p1) goto error;
p2 = malloc(…);
if (!p2) goto free1;
p3 = malloc(…);
if (!p3) goto free2;
…
free2:
free(p2);
free1:
free(p1);
error:
return -1;

答案 1 :(得分:3)

为什么不在一个功能中做所有事情?

void *unrecoverable_malloc(size_t size)
{
    void *x = malloc(size);

    if (x) {
        return x;
    }

    fprintf(stderr, "Memory allocation has failed.\n");
    exit(1);
}

虽然x = malloc(); if (!x) { /* recover */ }模式非常常见(并且是良好实践),但从OOM状态恢复非常困难。它给你一个温暖而模糊的感觉,检查分配失败,但在一个足够复杂的应用程序中,无论你做什么恢复可能都无法正常工作。

答案 2 :(得分:2)

那几乎是好的;只要你每次都以完全相同的方式处理错误。然而;在我的眼里,一个名为nullcheck的函数没有返回任何内容并且退出该程序充其量是不合适的。

答案 3 :(得分:1)

问:在malloc进入函数后,有没有理由不将null检查? 答:是的:转角案例:分配0

NULLmalloc()等返回calloc()本身并不是内存不足的明确迹象。

当请求金额为NULL时,分配函数可能会返回0。或者,这些函数可能会返回非NULL指针。

考虑将malloc()和测试放入1个函数中。

void *malloc_check(size_t n) {
  void *p = malloc(n);
  if (p == NULL && n > 0) {
    printf("Memory allocation has failed");
    exit(EXIT_FAILURE);
  }
  return p;
}

// or insure `malloc(0)` never occurs.

void *malloc_check(size_t n) {
  if (n == 0) n++;
  void *p = malloc(n);
  if (p == NULL) {
    printf("Memory allocation has failed");
    exit(EXIT_FAILURE);
  }
  return p;
}