C++ 用return语句结束析构函数安全吗?

C++ 用return语句结束析构函数安全吗?,c++,destructor,C++,Destructor,在我的双链表类中,我正在编写析构函数,这是我的代码: DLinkedList::~DLinkedList() { if (head==NULL) { return; } // Other code } 用返回结束析构函数是否安全语句 我知道我可以用返回来结束我的void函数语句,但这是一个析构函数 使用返回结束析构函数是否安全语句?我知道我可以用返回来结束我的void函数语句,但这是一个析构函数 析构函数与返回类型为void的函数没有太大区别,而且只要

在我的双链表类中,我正在编写析构函数,这是我的代码:

DLinkedList::~DLinkedList() {
    if (head==NULL) {
        return;
    }

    // Other code
}
返回结束析构函数是否安全语句

我知道我可以用
返回来结束我的
void
函数语句,但这是一个析构函数

使用
返回结束析构函数是否安全语句?我知道我可以用
返回来结束我的
void
函数语句,但这是一个析构函数

析构函数与返回类型为
void
的函数没有太大区别,而且只要类的生命周期结束,析构函数就会自动执行1

使用
return
是否应该停止析构函数的执行,就像您对任何其他函数所做的那样



1) 同样的情况也适用于构造函数。

是的,可以使用
返回来结束析构函数的执行。
是。

从这个意义上讲,析构函数体的行为与返回
void
的函数非常相似,不同的是,即使提前返回
,基和成员仍将被销毁(因为这从来都不依赖析构函数体的内容)

遵守以下规则:

:默认构造函数(
[class.default.ctor]
)、复制构造函数、移动构造函数(
[class.copy.ctor]
)、复制赋值运算符、移动赋值运算符(
[class.copy.assign]
)和析构函数(
[class.dtor]
)都是特殊的成员函数。[……]

:函数通过
return
语句返回其调用者

return
语句的expr或带括号的init列表称为其操作数。不带操作数的
return
语句只能在返回类型为cv void的函数、构造函数或析构函数中使用。[……]

:[…]析构函数中的
return
语句(
[stmt.return]
)可能不会直接返回调用方;在将控制传递给调用方之前,将调用成员和基的析构函数。[……]


是的,而且不仅安全。标准显式地声明它是等价的,并且显式地将析构函数作为空返回语句的一个用例

6.6.3返回语句[stmt.return]
1函数通过return语句返回调用方。
2既不带表达式也不带括号的init list的return语句只能用于不返回值的函数,即返回类型为cv void的函数、构造函数(12.1)、或析构函数(12.4)。
[…]
从函数末尾流出的等价于没有值的返回


(我添加了强调。)

是的,这并不比提前结束一个
void
函数更糟糕。但是,根据
//其他代码是什么,您可能可以重写析构函数,这样就根本不需要
if
。提前退出也可以。然而,我有时读到某些程序员认为早期的风格不好。我个人认为,嵌套
if
s的级联并没有那么好。所以,这可能是口味的问题。我发现了一个关于这个问题的Q/A:考虑到它已经关闭主要是基于意见……;规范性参考:结构化编程范式不赞成提前返回。对于我的C++代码,每当合适的时候我都会返回,但是有很多C++用户试图使他们的代码只返回到最后。我想他们是被教导了这个习惯,并坚持下去。(我想例外是例外,因为它们是另一条返回路径。)让我用另一个问题回答你的问题:为什么你认为它可能不安全?你是否认为它可能会返回“更多的”比击中关闭支架,从而跳过通常会发生在析构函数体之后的事情?如果“safe”只是“编译器应接受的有效代码”的一个误称,那么您应该打开警告来了解这一点。您是否可以在这里引用源代码,或者与此相关的一些基本原理?我在@coldspeed中引用过,但公认的编辑答案比我的更具分析性,因此它应该成为焦点,这是值得的。没有规则说应该只有一个好的答案。堆栈溢出的好处是,我可以对您的两个答案进行投票,而不仅仅是一个:)