2016-02-05 4 views
1

Я столкнулся с этим понятием безопасности контейнеров. Я хочу понять, что именно означает безопасное исключение? Есть ли для этого сравнение для разных контейнеров?Исключительный сейф контейнеров в C++

+0

https://en.wikipedia.org/wiki/Exception_safety –

+1

Существует много ресурсов, посвященных безопасности исключений. Обычно мы говорим о [* уровнях * безопасности] (https://en.wikipedia.org/wiki/Exception_safety). Высокопоставленные эксперты, такие как [Herb Sutter] (http://www.gotw.ca/gotw/059.htm), писали о том, как этого добиться. – BoBTFish

+0

Теперь я понимаю безопасность исключений и три канонические формы. Но что означает безопасность исключений для контейнера? Означает ли это, что даже контейнеры могут бросать исключения? – Barry

ответ

1

Если вы посмотрите на алгоритмы для различных структур данных, вы увидите, что они включают в себя последовательность шагов. Структура данных имеет некоторую целостность (постоянный внутренний смысл) в начале шагов и в конце.

Например, рассмотрите vector, который включает в себя dynamically growing array. Обычно это включает массив, целое число, описывающее размер массива, и целое число, описывающее количество используемых элементов. Когда элемент вставлен, может быть выделен новый массив в два раза по размеру, элементы скопированы в новое, целое число, описывающее размер, будет умножено на два, число, описывающее количество используемых элементов, будет увеличено на 1 и т. Д.

Исключение, созданное в этой точке (например, конструктором копирования элементов), может привести к последовательности шагов, которые должны быть завершены посередине. Например, если вы небрежно сначала обновите целые числа, только тогда выполните выделение и копии (и не поймайте исключения), тогда структура данных потеряет свою внутреннюю согласованность.

Смысл исключение безопасности для контейнеров STL заключается в том, что у них есть гарантии, что такие окончания оставят структуру данных в согласованном состоянии.

+0

Есть ли какие-либо контейнеры STL, исключающие безопасность? – Barry

+0

Да. В принципе, каждый из них гарантирует некоторую форму безопасности исключений. Вы должны разрабатывать классы для хорошего поведения (например, не «бросать» в деструкторы), а также улучшать их, также поддерживая семантику перемещения. Проконсультируйтесь с отдельной контейнерной документацией. –

+0

эффективный C++ by scott meyers - это книга, с которой можно начать с ... почти все контейнеры обеспечивают некоторую гарантированную безопасность исключений по спецификации C++. – basav