在C
我们使用malloc
系列函数时,我们应该添加一个条件来检查分配是否成功,如果没有,则打印一条消息。
如果我的代码中有很多分配,有什么理由说我不能将它作为一个功能吗?即:
void nullcheck(void * x){
if (x == NULL){
printf("Memory allocation has failed");
exit(1);
}
}
并调用函数:
int * a = malloc(sizeof(int));
nullcheck(a);
它使代码更好更短,是否有任何理由不应该这样做?
答案 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
从NULL
,malloc()
等返回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;
}