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