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

时间:2019-01-01 13:42:09

标签: c++ destructor

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

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

    //other code
}

我的问题是,用return;语句结束析构函数是否安全?我知道我可以使用void语句结束return;函数,但这是一个析构函数。

4 个答案:

答案 0 :(得分:28)

  

我的问题是,用return;语句结束析构函数是否安全?我知道我可以使用void语句结束return;函数,但这是一个析构函数。

析构函数与返回类型为void的函数没有太大区别,除了每当类的生命周期结束时析构函数会自动执行 1

与其他任何函数一样,如果应该停止执行析构函数,则使用return;


1) 构造函数BTW也是如此。

答案 1 :(得分:12)

是的

从这个意义上讲,析构函数的行为类似于返回void的函数,除了即使您早return仍会破坏基和成员(因为它从不依赖于内容)还是毁灭者的身体)。

遵守以下规则:

  

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

     

[stmt.return]/1:函数通过return语句返回其调用方。

     

[stmt.return]/2return语句的 expr-or-braced-init-list 称为其操作数。没有操作数的return语句只能在返回类型为 cv void 的函数,构造函数或析构函数中使用。 [..]

     

[class.dtor]/9 [..] 析构函数中的return语句([stmt.return])可能不会直接返回给调用者;在将控制权转移给调用者之前,将调用成员和基础的析构函数。 [..]

答案 2 :(得分:7)

是的,可以用return结束析构函数的执行。

答案 3 :(得分:1)

是的,它不仅安全,标准明确地声明了它是等效的,并且明确地将析构函数作为空return语句的一种用例。

  

6.6.3 return语句[stmt.return]
  1函数通过return语句返回其调用方。
  2既没有表达式也没有大括号的初始列表的return语句只能在不返回值的函数中使用,即,返回类型为cv void的函数,构造函数(12.1),或破坏者(12.4)。
  [...]
  从函数末尾流出的结果等效为无值的返回

(我加强调)