Вопрос сегодняшнего дня: могу ли я использовать this
в деструкторе, и если да, то каковы ограничения, которым я должен подчиняться ... Например, я знаю, что я не должен ничего делать с базовыми классами, поскольку они ушли , Но какие другие ограничения применяются? И могу ли я смело предположить, что this
(как указатель ... то есть адрес памяти ... номер) такой же, как в конструкторе?C++: Могу ли я использовать это безопасно в деструкторе?
ответ
Я не вижу проблем с использованием this
в деструкторе. В это время объект все еще существует. Деструктор предназначен для освобождения существующих ресурсов до уничтожения объекта.
Но избегайте вызова виртуальных функций.
Как answered here это совершенно верно.
Следует избегать calling virtual functions.
Да, вы можете использовать его в обычном режиме. У вас есть объект.
??? В типичном DTOR вы обязательно используете объект, который должен быть уничтожен. – manuell
Деструктор - это метод, который называется до, ваш объект физически разрушен, так что вы можете деинициализировать его должным образом. Для этого у вас должно быть есть доступ к его полям, поэтому вы можете безопасно получить к ним доступ это ключевое слово.
Порядок деструкторов обращен к конструкторам, поэтому, когда ваш деструктор работает, деструкторы базовых классов еще не запущены - у вас должен быть доступ ко всем их полям. С другой стороны, деструкторы производных классов уже запущены, так что - например, calling virtual or abstract methods может привести к неопределенному поведению.
Кроме того, имейте в виду, что это очень опасно для throw exceptions in destructors. Если вы это сделаете, вы рискуете прекратить свое заявление.
Поскольку объекты разрушены от самого производного класса до базы, производные классы деструкторы уже выполнили. Поэтому вы должны быть уверены, что не вызываете методы, переопределенные в производных классах, на this
. Кроме того, все в порядке.
Базовые классы не ушли в деструктор, вы можете использовать их в обычном режиме.
Производные классы : ушли, поэтому, в частности, виртуальные вызовы не достигнут производных классов.
this
имеет то же значение, что и в конструкторе и везде в классе.
Основное ограничение заключается в том, что вы не должны допускать, чтобы какое-либо исключение покидало деструктор. Это означает, что у вас нет средств указания отказа [*]. Как правило, вы должны выполнять только те операции, которые могут быть успешными (например, освобождение ресурсов, принадлежащих объекту): все, что вы делаете, может потерпеть неудачу, должно быть ОК, чтобы игнорировать сбой. Все, что вы делаете, что может бросить, вы должны поймать исключение. Надеюсь, вы полностью задокументировали возможные исключения, брошенные всеми функциями от this
, так что вы знаете, могут ли вещи, которые вы хотите делать с this
, бросить.
[*] Хорошо, вы могли бы построить механизм деструктора для записи где-то , что произошло, но пользователям этого класса пришлось бы активно его проверять.Это вряд ли приведет к приятному ощущению пользователя.
Могу ли я использовать
this
в деструкторе
Да.
Например, я знаю, что я не должен ничего делать с базовыми классами, так как они ушли.
Нет, базовые классы по-прежнему не повреждены. Члены (и, возможно, другие базовые классы) классов , полученных, уже были уничтожены, но члены и базовые классы этого класса остаются до завершения деструктора.
Но какие другие ограничения применяются?
Виртуальные функции отправляются в соответствии с классом, который в настоящее время уничтожается, а не бывший наиболее производный класс. Поэтому будьте осторожны, называя их и, в частности, не называйте какие-либо функции, которые являются виртуальными в этом классе.
Не отбрасывайте this
производному типу, так как он больше не является допустимым объектом этого типа.
Вы не можете delete this
от деструктора, по понятным причинам.
И могу ли я смело предположить, что это (как указатель ... то есть адрес памяти ... число) такое же, как в конструкторе?
Да, адрес объекта остается прежним до того, как его конструктор работает до тех пор, пока его деструктор не запустится.
- 1. Могу ли я использовать это доменное имя безопасно?
- 2. Могу ли я использовать int в многопоточном C++ безопасно?
- 3. удаления памяти безопасно в деструкторе
- 4. Как безопасно удалить указатель потока в деструкторе?
- 5. Безопасно ли вызывать remove() для удаления файлов в деструкторе?
- 6. Есть ли способ проверить, могу ли я безопасно использовать Page.IsValid?
- 7. Могу ли я использовать «uppercaseString» в таргетинге на приложения 8.0? Безопасно ли это до iOS 8.3?
- 8. Безопасно ли это использовать. Управление уровнем пользователя
- 9. Чтобы использовать shared_ptr, безопасно ли это?
- 10. ли strtok() безопасно использовать
- 11. Безопасно ли вызывать другие виртуальные методы в виртуальном деструкторе?
- 12. Могу ли я использовать htmlpurifier, как это
- 13. FormsAuthentication: Безопасно ли это?
- 14. C# Изображение.FromStream это безопасно?
- 15. C#: Безопасно ли это полевое назначение?
- 16. Безопасно ли «удалить это»?
- 17. Могу ли я использовать это утверждение?
- 18. Могу ли я использовать это заявление
- 19. Могу ли я безопасно использовать np.random.binomial со списком вероятностей
- 20. Могу ли я безопасно использовать 'getChildFragmentManager' внутри 'onCreateView'?
- 21. как я могу использовать UPX безопасно?
- 22. Могу ли я удалить указатели в деструкторе при сохранении в std :: vector property?
- 23. Насколько безопасно это использовать document.body.innerHTML.replace?
- 24. Могу ли я безопасно использовать соединение utf8mb4 с столбцами utf8?
- 25. Могу ли я безопасно использовать соединение utf8 с столбцами utf8mb4?
- 26. Могу ли я безопасно использовать DBI Perl вместо его использования?
- 27. Безопасно ли использовать os.environ.setdefault?
- 28. Могу ли я использовать Tk в C++?
- 29. C# checkboxes - Могу ли я это очистить?
- 30. Могу ли я использовать циклы в репитере? Рекомендуется ли это?
Возможный дубликат [Использование «этого» в деструкторе] (http://stackoverflow.com/questions/10979250/usage-of-this-in-destructor) – stefaanv