Подтвердить что ты не робот

Безопасно ли завершать деструктор оператором return?

В моем классе двусвязных списков я кодирую свой деструктор, и это мой код:

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

    // Other code
}

Безопасно ли завершать деструктор оператором return;?

Я знаю, что могу завершить свои функции void оператором return;, но это деструктор.

4b9b3361

Ответ 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).
[...]
Выход из конца функции эквивалентен возврату без значения

(Акцент был добавлен мной.)