为了账号安全,请及时绑定邮箱和手机立即绑定

是否使用GOTO?

/ 猿问

是否使用GOTO?

C++
萧十郎 2019-12-27 15:18:07

目前,我正在一个项目中大量使用goto语句。goto语句的主要目的是在例程中具有一个清理段,而不是多个return语句。如下所示:


BOOL foo()

{

   BOOL bRetVal = FALSE;

   int *p = NULL;


   p = new int;

   if (p == NULL)

   {

     cout<<" OOM \n";

     goto Exit;

   }


   // Lot of code...


Exit:

   if(p)

   {

     delete p;

     p = NULL;

   }

   return bRetVal;

}

这使工作变得更加容易,因为我们可以在代码的一个部分(即在“退出”标签之后)跟踪清理代码。


但是,我读过很多地方,使用goto语句是不好的做法。


目前,我正在阅读《代码完成》一书,它说我们需要使用靠近其声明的变量。如果使用goto,则需要在首次使用goto之前声明/初始化所有变量,否则编译器会给出错误消息,表明goto语句跳过了xx变量的初始化。


哪种方法正确?


从斯科特的评论:


似乎使用goto从一个部分跳转到另一部分是不好的,因为这会使代码难以阅读和理解。


但是,如果我们仅使用goto前进并指向一个标签,则应该很好(?)。


查看完整描述

3 回答

?
qq_花开花谢_0

我不确定清理代码是什么意思,但是在C ++中,有一个称为“ 资源获取就是初始化 ” 的概念,应该由析构函数负责清理内容。


(请注意,在C#和Java中,通常可以通过try / finally解决)


有关更多信息,请查看以下页面:http : //www.research.att.com/~bs/bs_faq2.html#finally


编辑:让我澄清一下。


考虑以下代码:


void MyMethod()

{

    MyClass *myInstance = new MyClass("myParameter");

    /* Your code here */

    delete myInstance;

}

问题:如果该函数有多个出口,会发生什么?您必须跟踪每个出口并在所有可能的出口处删除对象!否则,您将出现内存泄漏和僵尸资源,对吗?


解决方案:改用对象引用,因为当控件离开作用域时,它们会自动清除。


void MyMethod()

{

    MyClass myInstance("myParameter");

    /* Your code here */

    /* You don't need delete - myInstance will be destructed and deleted

     * automatically on function exit */

}

哦,是的,请使用std::unique_ptr或类似的方法,因为上面的示例显然是不完美的。


查看完整回答
反对 2019-12-27
?
慕雪9262066

我从未在C ++中使用过goto。曾经 永远 如果有这种情况,应该使用它,这种情况非常罕见。如果您实际上正在考虑将goto作为您逻辑的标准部分,那么事情就已经发生了。


查看完整回答
反对 2019-12-27
?
慕的地2183247

人们对于gotos和您的代码基本上有两点:

  1. 后藤很糟糕。 在一个需要使用goto的地方遇到这种情况非常罕见,但是我不建议您完全打败它。尽管C ++具有足够智能的控制流程,但很少适合使用goto。

  2. 您的清理机制是错误的:这一点更为重要。在C语言中,自己使用内存管理不仅可以,而且通常是做事的最佳方法。在C ++中,您的目标应该是尽可能避免内存管理。您应该尽可能避免内存管理。让编译器为您完成。而不是使用new,而只是声明变量。真正需要内存管理的唯一时间是事先不知道数据大小的情况。即使那样,您也应该尝试仅使用某些STL集合。

如果您合法地需要内存管理(您尚未真正提供任何证据),则应该通过构造函数将内存管理封装在一个类中以分配内存,而通过析构函数来取消分配内存。

从长远来看,您对做事方式要容易得多的回答并不是真的。首先,一旦您对C ++有深刻的了解,使此类构造函数成为第二自然。就我个人而言,我发现使用构造函数比使用清理代码更容易,因为我不需要仔细注意以确保我正确地进行了分配。取而代之的是,我可以让对象离开范围,而语言则由我自己处理。而且,维护它们比维护清理部分要容易得多,并且不容易出现问题。

简而言之,goto在某些情况下可能是一个不错的选择,但在这种情况下则不是。这只是短期的懒惰。


查看完整回答
反对 2019-12-27

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信