C ++ Boost侵入列表-示例

时间:2019-12-29 19:22:51

标签: c++ list boost containers boost-intrusive

我对增强型侵入式容器感到好奇,并想对其进行测试。我基本上在“如何使用Boost.Intrusive”一章中复制了来自boost.org的示例。所以我的代码看起来像这样:

#include <iostream>
#include <boost/intrusive/list.hpp>

using namespace boost::intrusive;

struct test_tag1;
struct test_tag2;

typedef list_base_hook< tag<test_tag1> > BaseHook;
typedef list_base_hook< tag<test_tag2> > BaseHook2;

class TestClass : public BaseHook, public BaseHook2 {
    public:
        int test_var;
};

typedef list< TestClass, base_hook<BaseHook> > class_list;
typedef list< TestClass, base_hook<BaseHook2> > class_list2;

int main() {
    class_list list;

    TestClass class1 = TestClass();
    list.push_back(class1);

    bool is_the_same = (&list.front() == &class1);
    std::cout << is_the_same;

    return 0;    
}

它编译成功,但是在执行时,我不断收到以下错误:

1Assertion failed: !hook.is_linked(), file boost/intrusive/detail/generic_hook.hpp, line 47

我打开generic_hook.hpp来检查是什么引起了这个错误,并且断言的描述是:

void destructor_impl(Hook &hook, detail::link_dispatch<safe_link>)
{  //If this assertion raises, you might have destroyed an object
   //while it was still inserted in a container that is alive.
   //If so, remove the object from the container before destroying it.
   (void)hook; BOOST_INTRUSIVE_SAFE_HOOK_DESTRUCTOR_ASSERT(!hook.is_linked());
}

但是那不能成立,至少我看不到我可能会意外销毁该物体的地方。 我尚不了解有关这些容器的所有详细信息,因此,我很高兴在这里获得一些帮助。

1 个答案:

答案 0 :(得分:3)

您在{em> class1之后声明了list 。因此,当main退出时,class1在{em> list被销毁之前被销毁。 (以相反的顺序破坏。)

您已将class1插入list中。因此,list被销毁时,仍插入容器中的class1不再存在。

class1的声明移到list的声明之前,以便稍后将其销毁。

还可以与the boost documentation进行比较,您可能从中构造了问题中的代码。在那里,元素对象也在列表之前声明。

通常,链接的文档页面底部的注释很重要。它说容器只存储一个引用,并且您必须确保插入的元素的存活时间比容器长。