2016-01-08 1 views
0

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

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

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

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

+0

Извините, вы можете изменить свои первые два абзаца. Я не понимаю этого. – Arunmu

+0

@Arunmu Не уверен. Я использую google translate, и это все, что я могу от него. – Orient

+0

@Arunmu Если вопрос действительно плохо сформулирован, вы можете просто проголосовать, чтобы его закрыть. – Orient

ответ

3

В случае исключения Allocator::deallocate() исключение исключений.

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

a.deallocate (р, п) [...] Не бросать исключения.

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

 Смежные вопросы

  • Нет связанных вопросов^_^