假设这是我的代码的一部分:
int foo()
{
char *p, *q ;
if((p = malloc(BUFSIZ)) == NULL) {
return ERROR_CODE;
}
if((q = malloc(BUFSIZ)) == NULL) {
free(p)
return ERROR_CODE;
}
/* Do some other work... */
free(p);
free(q);
}
由于第一个可能malloc
成功而第二个失败,所以我free(p)
在第二个“错误处理程序”中使用。但是,如果还有更多malloc
?我想修改代码(调整其顺序,添加或删除一些内容malloc
)怎么办?
我知道在C ++中有诸如RAII和异常安全之类的东西。但是,总的来说,处理malloc
C失败的正确方法是什么?(也许使用一些goto
?)
您的代码很好,但是对于很多变量,我希望:
int
foo()
{
char *p = NULL;
char *q = NULL;
int ret = 0;
if (NULL == (p = malloc(BUFSIZ)))
{
ret = ERROR_CODE;
goto error;
}
// possibly do something here
if (NULL == (q = malloc(BUFSIZ)))
{
ret = ERROR_CODE;
goto error;
}
// insert similar repetitions
// hopefully do something here
error:
free (p);
free (q);
return ret;
}
请注意,释放NULL
被定义为无操作。
这避免n
了n
变量的缩进级别。您可以类似地清理文件句柄等(尽管您必须在周围加上一个条件close()
)。
现在,如果您知道可以一次分配它们,那么dasblinkenlight有一个很好的答案,但是这是另一种方式:
int
foo()
{
int ret = 0;
char *p = malloc(BUFSIZ);
char *q = malloc(BUFSIZ);
char *r = malloc(BUFSIZ);
if (!p || !q || !r)
{
ret = ERROR_CODE;
goto exit;
}
// do something
exit:
free(p);
free(q);
free(r);
return ret;
}
最终可能性:如果您确实想在malloc
失败时退出程序,请考虑使用mallopt
的M_CHECK_ACTION
选项。这样可以malloc()
检查故障,并调用abort()
,并可能显示有用的消息。
从手册页:
姓名
mallopt
-设置内存分配参数概要
#include <malloc.h> int mallopt(int param, int value);
描述
该
mallopt()
函数调整控制内存分配函数行为的参数(请参阅参考资料malloc(3)
)。该param
参数指定要修改的参数,并value
指定该参数的新值。可以为以下值指定
param
:
M_CHECK_ACTION
设置此参数可控制在检测到各种编程错误(例如,释放同一指针两次)时glibc的响应方式。分配给该参数的值的3个最低有效位(2、1,和0)确定glibc行为,如下所示:
位0:如果设置了此位,则在其上打印一条单行消息,
stderr
其中提供有关错误的详细信息。该消息以字符串开头"*** glibc detected ***"
,后跟程序名称,检测到错误的内存分配函数的名称,错误的简要说明以及检测到错误的内存地址。位1:如果设置了此位,则在打印由位0指定的任何错误消息之后,通过调用终止程序
abort(3)
。在从2.4开始的glibc版本中,如果还设置了位0,则在打印错误消息和中止之间,程序还将以方式打印堆栈跟踪,并以方式backtrace(3)
打印进程的内存映射/proc/[pid]/maps
(请参阅参考资料proc(5)
)。位2:(自glibc 2.4起)仅当还设置了位0时,此位才有效。如果设置了此位,则描述错误的单行消息将简化为仅包含检测到错误的函数的名称以及错误的简短描述。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句