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



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

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

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

我知道我可以用return;语句结束void函数,但这是一个析构函数。

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

析构函数与具有void返回类型的函数没有太大区别,而且每当类的生存期结束时,析构函数都会自动执行1

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


1) 这同样适用于构造函数BTW。

从这个意义上说,析构函数体的作用很像返回void的函数,只是即使提前return,基和成员仍将被销毁(因为这无论如何都不依赖于析构函数主体的内容)。

遵守以下规则:

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

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

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

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

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

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

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

(我添加了重点。)

最新更新