2013-11-18 2 views
2

Вопрос сегодняшнего дня: могу ли я использовать this в деструкторе, и если да, то каковы ограничения, которым я должен подчиняться ... Например, я знаю, что я не должен ничего делать с базовыми классами, поскольку они ушли , Но какие другие ограничения применяются? И могу ли я смело предположить, что this (как указатель ... то есть адрес памяти ... номер) такой же, как в конструкторе?C++: Могу ли я использовать это безопасно в деструкторе?

+0

Возможный дубликат [Использование «этого» в деструкторе] (http://stackoverflow.com/questions/10979250/usage-of-this-in-destructor) – stefaanv

ответ

1

Я не вижу проблем с использованием this в деструкторе. В это время объект все еще существует. Деструктор предназначен для освобождения существующих ресурсов до уничтожения объекта.

Но избегайте вызова виртуальных функций.

1

Да, вы можете использовать его в обычном режиме. У вас есть объект.

+0

??? В типичном DTOR вы обязательно используете объект, который должен быть уничтожен. – manuell

1

Деструктор - это метод, который называется до, ваш объект физически разрушен, так что вы можете деинициализировать его должным образом. Для этого у вас должно быть есть доступ к его полям, поэтому вы можете безопасно получить к ним доступ это ключевое слово.

Порядок деструкторов обращен к конструкторам, поэтому, когда ваш деструктор работает, деструкторы базовых классов еще не запущены - у вас должен быть доступ ко всем их полям. С другой стороны, деструкторы производных классов уже запущены, так что - например, calling virtual or abstract methods может привести к неопределенному поведению.

Кроме того, имейте в виду, что это очень опасно для throw exceptions in destructors. Если вы это сделаете, вы рискуете прекратить свое заявление.

1

Поскольку объекты разрушены от самого производного класса до базы, производные классы деструкторы уже выполнили. Поэтому вы должны быть уверены, что не вызываете методы, переопределенные в производных классах, на this. Кроме того, все в порядке.

3

Базовые классы не ушли в деструктор, вы можете использовать их в обычном режиме.

Производные классы : ушли, поэтому, в частности, виртуальные вызовы не достигнут производных классов.

this имеет то же значение, что и в конструкторе и везде в классе.

Основное ограничение заключается в том, что вы не должны допускать, чтобы какое-либо исключение покидало деструктор. Это означает, что у вас нет средств указания отказа [*]. Как правило, вы должны выполнять только те операции, которые могут быть успешными (например, освобождение ресурсов, принадлежащих объекту): все, что вы делаете, может потерпеть неудачу, должно быть ОК, чтобы игнорировать сбой. Все, что вы делаете, что может бросить, вы должны поймать исключение. Надеюсь, вы полностью задокументировали возможные исключения, брошенные всеми функциями от this, так что вы знаете, могут ли вещи, которые вы хотите делать с this, бросить.

[*] Хорошо, вы могли бы построить механизм деструктора для записи где-то , что произошло, но пользователям этого класса пришлось бы активно его проверять.Это вряд ли приведет к приятному ощущению пользователя.

7

Могу ли я использовать this в деструкторе

Да.

Например, я знаю, что я не должен ничего делать с базовыми классами, так как они ушли.

Нет, базовые классы по-прежнему не повреждены. Члены (и, возможно, другие базовые классы) классов , полученных, уже были уничтожены, но члены и базовые классы этого класса остаются до завершения деструктора.

Но какие другие ограничения применяются?

Виртуальные функции отправляются в соответствии с классом, который в настоящее время уничтожается, а не бывший наиболее производный класс. Поэтому будьте осторожны, называя их и, в частности, не называйте какие-либо функции, которые являются виртуальными в этом классе.

Не отбрасывайте this производному типу, так как он больше не является допустимым объектом этого типа.

Вы не можете delete this от деструктора, по понятным причинам.

И могу ли я смело предположить, что это (как указатель ... то есть адрес памяти ... число) такое же, как в конструкторе?

Да, адрес объекта остается прежним до того, как его конструктор работает до тех пор, пока его деструктор не запустится.

Смежные вопросы