Безопасно ли завершать деструктор оператором return? - PullRequest
0 голосов
/ 01 января 2019

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

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

    //other code
}

Мой вопрос: безопасно ли завершать деструктор оператором return;?Я знаю, что могу использовать для завершения моих void функций оператором return;, но это деструктор.

Ответы [ 4 ]

0 голосов
/ 02 января 2019

Да, это не только безопасно, стандарт явно утверждает, что он эквивалентен, и он явно дает деструкторы в качестве одного варианта использования для пустых операторов возврата.

6.6.3 Оператор return [stmt.return]
1 Функция возвращается к своему вызывающему оператору с помощью оператора return.
2 Оператор return без выражения или фигурного-инициализированного списка не можетиспользоваться только в функциях, которые не возвращают значение, то есть функции с возвращаемым типом cv void, конструктором (12.1), или деструктором (12.4).
[...]
Выход из конца функции равен эквивалент возвращению без значения

(выделено мной)

0 голосов
/ 01 января 2019

Да, все в порядке, чтобы завершить выполнение деструктора с return.

0 голосов
/ 01 января 2019

Да.

В этом смысле тело деструктора действует так же, как функция, которая возвращает 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]) в деструкторе можетне возвращаться напрямую к абоненту;перед передачей управления вызывающей стороне деструкторы для членов и баз вызываются. [..]

0 голосов
/ 01 января 2019

Мой вопрос: безопасно ли завершать деструктор оператором return;?Я знаю, что могу использовать для завершения моих void функций с помощью оператора return;, но это деструктор.

Не так много отличий функции-деструктора от функции с void типом возвратаКроме того, функция деструктора выполняется автоматически 1 всякий раз, когда заканчивается время жизни класса.

Вы используете return;, если выполнение функции деструктора должно быть остановлено, как вы делаете с любой другой функцией.


1) То же самое относится и к функциям конструктора BTW.

...