Безопасно ли завершать деструктор оператором return?
В моем классе двусвязных списков я кодирую свой деструктор, и это мой код:
DLinkedList::~DLinkedList() {
if (head==NULL) {
return;
}
// Other code
}
Безопасно ли завершать деструктор оператором return;
?
Я знаю, что могу завершить свои функции void
оператором return;
, но это деструктор.
Ответы
Ответ 1
Безопасно ли завершать деструктор оператором return;
? Я знаю, что могу завершить свои функции void
оператором return;
, но это деструктор.
Функция деструктора не сильно отличается от функции с типом возвращаемого значения void
, кроме того, функция деструктора выполняется автоматически 1 всякий раз, когда заканчивается время жизни класса.
Вы используете return;
, если выполнение функции деструктора должно быть остановлено, как вы делаете с любой другой функцией.
1)То же самое относится и к функциям конструктора BTW.
Ответ 2
Да.
В этом смысле тело деструктора действует так же, как функция, которая возвращает void
, за исключением того, что базы и элементы все равно будут уничтожены, даже если вы return
рано (поскольку в любом случае это никогда не зависело от содержимого тела деструктора).
Соблюдайте следующие правила:
[special]/1
: конструктор по умолчанию ([class.default.ctor]
), конструктор копирования, конструктор перемещения ([class.copy.ctor]
), оператор назначения копирования, оператор назначения перемещения ([class.copy.assign]
) и деструктор ([class.dtor]
) являются специальными членами функции. [..]
[stmt.return]/1
: функция возвращается к своему вызывающему оператору return
.
[stmt.return]/2
: список expr-or-braced-init-list оператора return
называется его операндом. Оператор return
без операнда должен использоваться только в функции, тип возвращаемого значения которой cv void, конструктор или деструктор. [..]
[class.dtor]/9
: [..] Оператор return
([stmt.return]
) в деструкторе может напрямую не возвращаться к вызывающей стороне; перед передачей управления вызывающей стороне деструкторы для членов и баз вызываются. [..]
Ответ 3
Да, это нормально, чтобы закончить выполнение деструктора с return
.
Ответ 4
Да, и это не только безопасно. Стандарт явно утверждает, что он эквивалентен, и он явно дает деструкторы в качестве одного варианта использования для пустых операторов возврата.
6.6.3 Оператор возврата [stmt.return]
1 Функция возвращает вызывающей стороне оператор return.
2 Оператор возврата без выражения или списка фигурных скобок не может использоваться только в функциях, которые не возвращают значение, то есть функции с типом возврата cv void, конструктором (12.1), или деструктор (12.4).
[...]
Выход из конца функции эквивалентен возврату без значения
(Акцент был добавлен мной.)