Деструкторы не могут выдавать исключения (поэтому разматывание стека может завершиться во время обработки исключений) и должны освобождать любые ресурсы, выделенные объекту (поэтому утечка ресурсов отсутствует). Проект для объекта, который содержит несколько других объектов (или выделено несколько ресурсов), может записывать указатели на них в контейнере STL. Поэтому деструктор будет использовать следующие методы, связанные с итераторами:
begin()
, end()
для контейнера
operator++
для действительного итератора
operator*
или operator->
для действительного итератора
Но чтобы гарантировать, что деструктор не генерирует исключения и освобождает свои ресурсы, вам нужно полагаться на эти методы, никогда не генерирующие исключения.
Безопасно ли полагаться на эти методы, никогда не создавая исключения? Трудно представить практическую реализацию, которая бы генерировала исключения, так как итератор STL по сути является указателем. Но требует ли стандарт C ++ , чтобы эти методы никогда не генерировали исключения? Я не нашел четкого утверждения в стандарте C ++.
Редактировать : Интересный случай для C ++ 03, когда вы хотите иметь контейнер указателей на ресурсы . Есть веские причины для этого; например, если у вас есть полиморфные ресурсы. Как указывает Björn Pollex в своем ответе, если вы используете контейнер ресурсов (например, std::list< Resource >
), а не контейнер указателей на ресурсы, деструктор контейнера позаботится об уничтожении ( освобождение) Resource
объектов для вас.