在C语言中,处理错误的void返回函数

3
给出这个函数的例子:
假设我只能更改函数中的else语句,那么在内存分配错误时应该如何处理?由于函数返回void,因此我无法返回某些错误代码;在C中我也无法抛出异常;我不能仅仅为了一个相对于程序正在执行的其他事情来说可能是次要错误而停止函数的执行……那么我应该让指针为空,并让使用我的函数的编码人员在调用我的函数后处理错误吗?
我只能使用以下库中的函数:stdio.h、stdlib.h、string.h、stdarg.h。
谢谢!

如果您在 f() 中添加一个 retcode 输出参数,那么您可以返回一个错误代码。例如,如果您想处理 pNULL 的情况,这将非常有用。 - John Saxton
@H2CO3:这样做会导致内存泄漏。 - alk
@alk 当然会,我没有考虑清楚,抱歉。 - user529758
@H2CO3 *p 已经等于 NULL... 并且 return ; 真的不必要。删除 else 并记录 realoc 可能的内存泄漏。 - user457015
4个回答

2
*p = NULL;
syslog(LOG_ERR, "Memory allocation error");

谢谢!很高兴知道我可以在其他情况下使用syslog函数,但是在这里我只有这些库:stdio.h、stdlib.h、string.h和stdarg.h。 - Zack
最终,验证函数的返回值/输出是调用者的责任。因此,请删除syslog并继续使用它。 - user457015
按照你提出的做法会导致内存泄漏。 - alk
@alk,最终处理这个问题的责任在于调用者。记录输出即可。 - user457015

2
我应该让指针为空,让使用我的函数的编码器在调用我的函数后处理错误吗?
可能是的。但不仅是“之后”,还有之前,也就是编码器需要存储指向您的函数指针所指向地址的副本。因为如果编码器没有这样做,而您的函数失败了,程序会泄漏内存,即指向地址引用的内存。
char * p = malloc(42);

{
  char * p_save = p;

  f(&p_save, "");
  if (NULL == p_save)
  {
    /* log error or what ever is needed, including freeing p and return, exit or abort */
  }
  else
  {
    p = p_save;
  }
}

free(p);

或者将那个有问题的函数包裹到一个更容易处理的东西中:
int fex(char ** pp, const char * t)
{
  char * p = *pp; /* Store a backup, just in case. */

  f(pp, t);

  if (NULL == *pp)
  {
     *pp = p; /* Opps, restore ... */
     return -1; /* ... and indicate error. errno should already have been set by realloc in f. */
  }

  return 0; /* Good. */
}

或者(有点脏):
char * fex(char * p, const char * t)
{
  f(&p, t);

  if (NULL == p)
  {
     return (char *) -1; /* ... and indicate error. errno should already have been set by realloc in f. */
  }

  return p; /* Good. */
}

像这样调用后者:

char * p = malloc(42);

{
  char * tmp = fex(p, "");
  if ((char *) -1) == tmp)
  {
    perror("fex() failed");
  }
  else
  {
    p = tmp;
  }
}

free(p);

2

在课堂上我们要做的是:

printf("Error allocating memory.");
exit(1);

或者简单地使用exit(1)。如果您的内存已满,那么从那里开始您就无法做太多事情了。


1
通常这样处理:

通常这样处理:

abort();

在许多程序和库的实现中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接