暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

goto语句对与错

二进制人生 2020-09-16
625

点击上方蓝字关注我!


很多书籍都会把“”goto“”当成反面教材使用,认为如果使用不当,将会造成很多意想不到的问题。但goto作为C语言的一部分,存在即合理,goto有它的缺点,也有它的优点。

缺点:
很容易把逻辑弄乱,增加理解难度,goto是可以实现无条件跳转的,一旦跳转,就忽略很前面很多代码,特别是在一些逻辑复杂的地方使用,会很容易出问题。所以goto能不用就不用,特别对于新手,尽量避讳。


优点:
方便处理异常情况,特别是内存等系统资源的释放。很多大型项目,开源项目,包括Linux内核,都会使用goto来处理异常情况。

举个例子,以下情况,大家第一反应是没有问题,其实是存在内存泄漏隐患的。如果变量pdate2申请失败,则退出函数。那么问题来了, pdate 申请成功了,但没有得到释放,出现了内存泄漏。所以这种情况如果使用goto,就很容易解决问题。

int module_init()
{
char *pdate = (char *)malloc(100);
if(pdate == NULL)
return -1;

char *pdate2 = (char *)malloc(100);
if(pdate2 == NULL)
return -1;

free(pdate);
free(pdate2);
......
}

goto实现代码

int module_init()
{
char *pdate = (char *)malloc(100);
if(pdate == NULL)
goto err;

char *pdate2 = (char *)malloc(100);
if(pdate2 == NULL)
goto err;

free(pdate);
free(pdate2);
......


err://统一的出错处理
if(pdate != NULL)
free(pdate);
if(pdate2!= NULL)
free(pdate2);
  return -1;
}

另一种写法就是分阶段处理:

 if(pdate == NULL)
    goto err1;
    ...
  if(pdate2 == NULL)
goto err2;
...
 err1:
  free(pdate);
 err2:
  free(pdate2);
  ...


总结:存在即合理,好坏取决于如何使用。





二进制人生


专注于编程知识和软件设计分享,包括但不限于C/C++、linux开发。偶尔也聊聊程序人生。





长按二维码,关注我们


文章转载自二进制人生,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论