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