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>