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) [...] Не генерирует исключения.

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

Другие вопросы по тегам