Для std :: map, как будет вести себя вставка, если она должна изменить размер контейнера, а память недоступна? - PullRequest
4 голосов
/ 19 сентября 2008

Для std :: map, как будет вести себя вставка, если она должна изменить размер контейнера, а память недоступна?

Ответы [ 3 ]

6 голосов
/ 19 сентября 2008

STL карта не должна «изменять размер» контейнера. карта (как и список) является контейнером на основе узлов; каждая вставка выделяет память.

Тем не менее, ситуация с нехваткой памяти обрабатывается так же, как и любая другая ситуация с нехваткой памяти в C ++: она генерирует std :: bad_alloc. Контейнеры STL с распределителями по умолчанию ничего необычного не делают, все они в конечном итоге выделяются с помощью стандартных операторов new / delete каким-то образом .

В случае карты STL она выдаст исключение и будет вести себя так, как если бы она не была вызвана. То есть контейнер останется неизменным.

0 голосов
/ 19 сентября 2008

Чтобы развернуть ответ Nils (да, он бросит), но то, что происходит, когда он бросает, иногда сбивает с толку в спецификации.

В 17.2.2 спецификации (относительно карт / исключений), если метод insert () выбрасывает, эта функция не действует. Это сильная гарантия для карты. Это отличается от контейнеров, использующих непрерывное распределение, например vector или deque.

0 голосов
/ 19 сентября 2008

Новый вызовет исключение. Легко, как это.

Вставка не произойдет, и содержимое словаря не будет изменено или повреждено.

...