所以我正在做一个小项目,涉及不时使用malloc
、realloc
和calloc
函数。我明白,每次分配后我都应该检查它是否失败并且它指向 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
,因此您还需要检查这一点。
然后,您可以为 realloc
和 calloc
创建类似的函数。
一切都很好,但只做一件事而不是打印消息 获得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
永远不会失败,即使您的虚拟地址空间已用尽(。