在我的双向链接列表类中,我正在编码析构函数,这是我的代码:
DLinkedList::~DLinkedList() {
if(head==NULL){
return;
}
//other code
}
我的问题是,用return;
语句结束析构函数是否安全?我知道我可以使用void
语句结束return;
函数,但这是一个析构函数。
答案 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]/2
:return
语句的 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)。
[...]
从函数末尾流出的结果等效为无值的返回
(我加强调)