Я хочу использовать распределитель стека Hinnant ( документация , реализация ) в сочетании с контейнерами STL, но я хочу изменить его так, чтобы динамическое выделение памяти НИКОГДА не происходило .
Одна вещь, которая должна быть сделана, чтобы выполнить это, должна заменить вызовы new / delete в методах allocate / deallocate, которые имеют место, если в буфере, предоставленном стеком, нет места.
Нокак я должен иметь дело с исключениями?Контейнеры STL могут выдавать исключения, например
std :: vector :: at
"Функция автоматически проверяет, находится ли n в пределах допустимых элементов в векторе, выбрасываяисключение out_of_range, если оно не [...] "
http://www.cplusplus.com/reference/vector/vector/at/
Я не смог найти четкого ответа, хранятся ли исключения в динамической или статической памяти.Только эти строки дают подсказки:
From [exc.throw] /15.1/4:
Память для объекта исключения выделена неопределенным образом, за исключением случаев, отмеченных в 3.7..4.1.
В заключительной ссылке [basic.stc.dynamic.allocation] / 4 говорится:
[Примечание. В частности, функция глобального распределения не вызывается для выделения хранилища для[...] объект исключения (15.1).- примечание к концу]
https://stackoverflow.com/a/27259902/8007684
Что именно это означает?Зарезервирована ли память для исключений в статической памяти?Или все еще есть какие-либо распределения, происходящие "неуказанным способом", который означал бы, что исключения будут храниться динамически?Приведенное описание занимает много места для интерпретации ...
Итак, мой основной вопрос: Безопасно ли использовать контейнеры STL + распределитель стека Хиннанта, если использование динамической памяти запрещено?Или это не работает, и мне нужно либо использовать -fno-exceptions
для замены исключений вызовами abort()
, либо реализовать собственные замены контейнеров STL, которые не генерируют исключения ...?
Заранее спасибо!
вдохновляют