Навязчивые крючки могут быть сконфигурированы для работы в режиме безопасной связи. Безопасный режим активируется по умолчанию, но он также может быть явно активирован:
//Configuring the safe mode explicitlyclassFoo:publiclist_base_hook<link_mode<safe_link>>{};
В безопасном режиме пользователь может определить, действительно ли объект вставлен в контейнер без какой-либо внешней ссылки. Рассмотрим основные особенности безопасного режима:
Конструктор Крюка помещает крюк в известное состояние по умолчанию.
Деструктор Крюка проверяет, находится ли крюк в известном состоянии по умолчанию. Если нет, то высказывается утверждение.
Каждый раз, когда объект вставляется в интрузивный контейнер, контейнер проверяет, находится ли крюк в известном состоянии по умолчанию. Если нет, то высказывается утверждение.
Каждый раз, когда объект стирается из навязчивого контейнера, контейнер помещает стертый объект в известное состояние по умолчанию.
С помощью этих функций без какой-либо внешней ссылки пользователь может узнать, был ли объект вставлен в контейнер, позвонив в функцию члена is_linked(). Если объект фактически не вставлен в контейнер, крючок находится в состоянии по умолчанию, а если он вставлен в контейнер, крючок не находится в состоянии по умолчанию.
По умолчанию все утверждения безопасного режима, поднятые Навязчивые крючки и контейнеры , реализуются с использованием BOOST_ASSERT, который может быть настроен пользователем. См. http://www.boost.org/libs/utility/assert.html для получения дополнительной информации о BOOST_ASSERT.
BOOST_ASSERT настроен глобально, поэтому пользователь может захотеть переопределить навязчивые утверждения безопасного режима без изменения глобального BOOST_ASSERT. Это может быть достигнуто путем переопределения следующих макросов:
BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT: Это утверждение будет использоваться в функциях вставки интрузивных контейнеров для проверки того, что крючок значения, подлежащего вставке, построен по умолчанию.
BOOST_INTRUSIVE_SAFE_HOOK_DESTRUCTOR_ASSERT: Это утверждение будет использоваться в деструкторах крючков для проверки того, что крюк находится в состоянии по умолчанию.
Если какой-либо из этих макросов не будет переопределен, утверждение будет по умолчанию BOOST_ASSERT. Если определен BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT или BOOST_INTRUSIVE_SAFE_HOOK_DESTRUCTOR_ASSERT и программисту необходимо включить файл для настройки этого утверждения, он может определить BOOST_INTRUSIVE_SAFE_HOOK_DESTRUCTOR_INCLUDE или BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT_INCLUDE с указанием имени файла:
Статья Safe hooks раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 17. Boost.Intrusive может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.