Boost C++ 库

...世界上最受推崇、设计最精巧的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ Coding Standards

安全钩子 - Boost C++ 函数库
PrevUpHomeNext

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_ASSERTBOOST_INTRUSIVE_SAFE_HOOK_DESTRUCTOR_ASSERT,并且程序员需要包含一个文件来配置该断言,则可以通过定义 BOOST_INTRUSIVE_SAFE_HOOK_DESTRUCTOR_ASSERT_INCLUDEBOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT_INCLUDE 并提供要包含的文件名来完成。

#define BOOST_INTRUSIVE_SAFE_HOOK_DESTRUCTOR_ASSERT          MYASSERT
#define BOOST_INTRUSIVE_SAFE_HOOK_DESTRUCTOR_ASSERT_INCLUDE <myassert.h>

PrevUpHomeNext