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