std :: terminate и деструкторы пустых контейнеров

Рассмотрим некоторый стандартный контейнер, который использует динамическую память (т.е. AllocatorAwareContainer) и имеет размер и емкость ноль. Например, взять std::vector и позвонить vec.resize(0); vec.shrink_to_fit();,

Я предположил бы, что такие экземпляры контейнера будут содержать только nullptr указатели на их логическое содержание и std::size_t Участники отслеживать информацию, как size, Я также предположил бы, что их деструкторы по существу ничего не сделают, поскольку нет динамической памяти, которую нужно освободить.

Все деструкторы контейнеров, как я знаю, являются noexcept, То есть на бросание исключения во время уничтожения они должны вызвать std::terminate, Это возможно в случае Allocator::deallocate() бросить исключение.

Могу ли я быть уверен, что контейнеры в состоянии, описанном выше, никогда не вызывают std::terminate на уничтожение?

0

Решение

Это возможно в случае Allocator::deallocate() бросить исключение.

Нет, это не так. Требования к Allocator запретить deallocate бросать. Это не формальный noexcept спецификатор, но C ++ 14 Таблица 28 Требования к распределителю гласят:

a.deallocate (p, n) […] Не генерирует исключения.

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

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector