gpt4 book ai didi

c++ - GOTO 还是不 GOTO?

转载 作者:IT老高 更新时间:2023-10-28 13:21:40 25 4
gpt4 key购买 nike

目前我正在开发一个大量使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com