std::terminate и деструкторы пустых контейнеров
Рассмотрим некоторый стандартный контейнер, который использует динамическую память (т.е. является AllocatorAwareContainer) и имеет размер и емкость, равные нулю. Например, взять std::vector
и позвонить vec.resize(0); vec.shrink_to_fit();
,
Я предположил бы, что такие экземпляры контейнера будут содержать только nullptr
указатели на их логическое содержание и std::size_t
Участники отслеживать информацию, как size
, Я также предположил бы, что их деструкторы по существу ничего не сделают, поскольку нет динамической памяти, которую нужно освободить.
Все деструкторы контейнеров, как я знаю, являются noexcept
, Т.е. на бросание исключения во время уничтожения они должны вызывать std::terminate
, Это возможно в случае Allocator::deallocate()
бросить исключение.
Могу ли я быть уверен, что контейнеры в состоянии, описанном выше, никогда не вызывают std::terminate
на уничтожение?
1 ответ
Это возможно в случае
Allocator::deallocate()
бросить исключение.
Нет, это не так. Требования к Allocator
запретить deallocate
бросать. Это не формальный noexcept
спецификатор, но C++14 Таблица 28 Требования к распределителю гласят:
a.deallocate (p, n) [...] Не генерирует исключения.
Так что, если ваш распределитель выбрасывает освобождение, это является нарушением требуемого контракта, и все ставки в любом случае отменены.