Подтвердить что ты не робот

May методы итератора STL вызывают исключение

Деструкторы не могут генерировать исключения (так что разворачивание стека может завершиться во время обработки исключений) и должен освободить любые ресурсы, выделенные объекту (поэтому утечки ресурсов не происходит). Конструкция объекта, который содержит несколько других объектов (или выделяется несколько ресурсов), может записывать указатели на них в контейнере STL. Поэтому деструктор использовал бы следующие методы, связанные с итератором:

  • begin(), end() для контейнера
  • operator++ для действительного итератора
  • operator* или operator-> для действительного итератора

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

Можно ли полагаться на эти методы, никогда не бросая исключений? Трудно представить себе практическую реализацию, которая будет генерировать исключения, так как под капотом STL-итератор по существу является указателем. Но имеет ли стандартный С++ запрос, что эти методы никогда не бросают исключения? Я не нашел четкого утверждения в стандарте С++.


Изменить. Интересный случай для С++ 03, если вы хотите иметь контейнер указателей на ресурсы. Для этого есть веские причины; например, если у вас есть полиморфные ресурсы. Поскольку Björn Pollex указывает в своем ответе, если вы используете контейнер ресурсов (например, std::list< Resource >), а не контейнер указателей на ресурсы, деструктор контейнер позаботится об уничтожении (освобождении) объектов Resource для вас.

4b9b3361

Ответ 1

operator ++ для действительного итератора

Стандарт С++ (я имею в виду проект N3290) не дает гарантии nothrow для оператора инкремента итераторов.

Например, std::istreambuf_iterator::operator++ влияет на вызов std::basic_streambuf::sbumpc. sbumpc может вызывать uflow, который, в свою очередь, может генерировать исключение.

Ответ 2

никакой конструктор копирования или оператор присваивания возвращенного итератора не генерирует исключение

Это из стандарта С++ 03. Я не думаю, что стандарт идет дальше.

Btw. it 23.1.10

Ответ 3

Таким образом, деструктор будет использовать следующие связанные с итератором Методы

Нет, не будет. Деструктор этого объекта просто вызовет деструктор контейнера, который, в свою очередь, гарантированно не будет генерировать исключение.

Если вы используете RAII правильно, вы почти никогда не столкнетесь с сценарием, в котором вы должны явно выделять ресурсы. Это может быть достигнуто с помощью контейнера хранения shared_ptr или unique_ptr или с помощью чего-то вроде Boost.Pointer Container.

Ответ 4

В соответствии с http://www.tenouk.com/Module31.html эти операции (для '*' и '- > ' это зависит также от сохраненного типа) не выбрасывают для контейнеров STL.