2

我对升压侵入式容器很好奇,并想对其进行测试。我基本上从 boost.org 的“如何使用 Boost.Intrusive”一章中复制粘贴了示例。所以我的代码如下所示:

#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());
}

但这不可能是真的,至少我看不到我可能在哪里意外破坏了该对象。我还不知道这些容器的所有细节,所以我会很感激在这里得到一些帮助。

4

1 回答 1

3

class1 在之后 list声明。所以main退出的时候,是之前class1被销毁的。(破坏顺序与构造相反。) list

您已class1插入list. 所以当list被销毁时,class1仍然插入到容器中的 ,不再活着。

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

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

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

于 2019-12-29T19:28:04.850 回答