Boost.Intrusive 钩子可以配置为在安全链接模式下运行。安全模式默认激活,但也可以显式激活。
//Configuring the safe mode explicitly class Foo : public list_base_hook< link_mode<safe_link> > {};
通过安全模式,用户可以在没有外部引用的情况下检测对象是否实际插入到容器中。让我们回顾一下安全模式的基本特性:
有了这些特性,在没有任何外部引用的情况下,用户可以通过调用 is_linked() 成员函数来知道对象是否已插入到容器中。如果对象未实际插入到容器中,则钩子处于默认状态;如果已插入到容器中,则钩子不处于默认状态。
默认情况下,Boost.Intrusive 钩子和容器中引发的所有安全模式断言都使用 BOOST_ASSERT 实现,用户可以对其进行配置。有关 BOOST_ASSERT 的更多信息,请参阅 https://boost.ac.cn/libs/utility/assert.html。
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_ASSERT_INCLUDE 或 BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT_INCLUDE 并指定要包含的文件名。
#define BOOST_INTRUSIVE_SAFE_HOOK_DESTRUCTOR_ASSERT MYASSERT #define BOOST_INTRUSIVE_SAFE_HOOK_DESTRUCTOR_ASSERT_INCLUDE <myassert.h>