C语言 创建一个函数来检查 malloc 是否成功



所以我正在做一个小项目,涉及不时使用mallocrealloccalloc函数。我明白,每次分配后我都应该检查它是否失败并且它指向 null,如下所示:

int* arr = malloc(size*sizeof(int));
if (!arr)
{
      printf("ERROR! Not enough memory!n");
      exit(1); // to exit the program immedietly.
}

我想知道是否可以创建一个方法,像这样对每种指针执行此操作:

void checkOutOfMemory(const void* p) //gets a pointer and exit program if points to null.
{
    if (!p)
    {
        printf("ERROR! Out of memory!n");
        exit(1);
    }
}

我的意思是,到目前为止它有效,但我开始想知道是否有任何我不知道的特殊情况。

这是执行此类检查的好方法。 它可以防止错误检查代码在许多地方重复。 但是,您应该使用perror它将包含malloc失败原因的文本描述。

您可以更进一步,立即执行分配和检查:

void *safe_malloc(size_t size)
{
    void *ptr = malloc(size);
    if (!ptr && (size > 0)) {
      perror("malloc failed!");
      exit(EXIT_FAILURE);
    }
    return ptr;
}

由于如果给定大小为 0,malloc 可以在成功时返回NULL,因此您还需要检查这一点。

然后,您可以为 realloccalloc 创建类似的函数。

一切都很好,但只做一件事而不是打印消息 获得malloc设置errno的事实的好处(不是来自标准,而是来自基于开放组的规范(。所以这样做

if(!p)
  perror("malloc failed");
  exit(EXIT_FAILURE);    
}

perror执行此操作 - 将从strerror(errno)生成的消息附加到您正在打印的字符串中。(给你一个合理的理由

来说明malloc的失败(。

此外,当您这样做时,您必须记住一件事

void *p = malloc(SOMESIZE);

检查是否SOMESIZE == 0,因为当您将0传递给它时malloc可能会返回NULL。单独处理该情况。以防万一您遇到SIZE!=0并在抛出错误中NULL p

此外,malloc 的参数类型是 unsigned在调用 my_malloc 之前检查是否满足该条件。

代码将是这样的,

void * my_malloc(size_t SIZE){
  void *p = malloc(SIZE);
  if(p == NULL && SIZE){
     perror("malloc failed");
     exit(EXIT_FAILURE);    
  }
  return p;
}

注意:malloc失败中errno设置在基于组的开放规范中指定(alk提到了它(。

您可以将malloc编码为包装器,以检查失败,如 dbush 所回答的那样。

实际上,这样的函数通常被称为xmalloc,由许多(自由软件(库提供,特别是GNU自由。看到这里。

但是,有些系统存在内存过度使用;这是我不喜欢的功能(它使malloc永远不会失败,即使您的虚拟地址空间已用尽(。

相关内容

  • 没有找到相关文章

最新更新