在我的双链表类中,我正在对析构函数进行编码,这是我的代码:
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]/2
:return
语句的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)的函数。
[…]
从函数末尾流出与无值的返回等价
(我添加了重点。)