函数只有一个出口,不允许中间return、break、continue
void Func(void)
{
char* p1 = null;
char* p2 = null;
char* p3 = null;
p1 = (char*)malloc(10);//p1已经分配,必须释放
if(!p1) return;
p2 = (char*)malloc(10);
if(!p2)
{
free(p1);
p1 = null;//由于p2分配失败,必须释放p1
return;
}
p3 = (char*)malloc(10);//p3已经分配,必须释放
if(!p3)
{
free(p1);
p1 = null;//由于p2分配失败,必须释放p1和p2
free(p2);
p2 = null;
return;
}
//...
//函数结束时,还要书写释放代码
if(p1)
{
free(p1);
p1 = null;
}
if(p2)
{
free(p2);
p2 = null;
}
if(p3)
{
free(p3);
p3 = null;
}
}
换成goto
void Func(void)
{
char* p1 = null;
char* p2 = null;
char* p3 = null;
p1 = (char*)malloc(10);
if(!p1) goto Func_End_Process;
p2 = (char*)malloc(10);
if(!p2) goto Func_End_Process;
p3 = (char*)malloc(10);
if(!p3) goto Func_End_Process;
Func_End_Process:
if(p1)
{
free(p1);
p1 = null;
}
if(p2)
{
free(p2);
p2 = null;
}
if(p3)
{
free(p3);
p3 = null;
}
}
本文摘自《0 bug:C/C++商用工程之道》 肖舸 著