c++ - GOTO 还是不 GOTO?

标签 c++ goto

目前我正在开发一个大量使用 goto 语句的项目。 goto 语句的主要目的是在例程中有一个清理部分,而不是多个返回语句。 如下:

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;
}

这使得我们可以在代码中的某个部分(即 Exit 标签之后)跟踪我们的清理代码变得更加容易。

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

目前我正在阅读 Code Complete 书,它说我们需要使用接近其声明的变量。如果我们使用 goto,那么我们需要在第一次使用 goto 之前声明/初始化所有变量,否则编译器会给出错误,即 goto 语句跳过了 xx 变量的初始化。

哪种方式对?


来自斯科特的评论:

使用 goto 从一个部分跳转到另一个部分似乎很糟糕,因为它使代码难以阅读和理解。

但是如果我们使用 goto 只是为了前进并到达一个标签,那应该没问题(?)。

最佳答案

我不确定你所说的清理代码是什么意思,但在 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或类似的东西,因为上面的例子显然是不完美的。

关于c++ - GOTO 还是不 GOTO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/379172/

相关文章:

c++ - goto 和析构函数兼容吗?

c# - 在这种情况下可以使用 "goto"吗?

c++ - 在纯 C++ 中创建 BMP

c++ - 具有 memory_order_relaxed 的存储是否有可能永远不会到达其他线程?

c# - 我们应该把枚举放在哪里?

c++ - XCode 4 控制台不会接受用户输入

.net - 是否可以从嵌套函数中得到 "return twice"?

c++ - 如何将 unix-exe 发送给我的 friend ,以便他可以通过双击运行它?

java - 如何在不同的代码段之间跳转?

c++ - 转到优化重构