【问题标题】:C++ Boost Intrusive List - ExampleC++ Boost 侵入式列表 - 示例
【发布时间】:2020-04-18 17:05:10
【问题描述】:

我对 boost 侵入式容器很好奇,并想对其进行测试。我基本上从 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());
}

但这不可能是真的,至少我看不到我可能在哪里意外破坏了该对象。 我还不知道有关这些容器的所有详细信息,因此我将不胜感激在这里获得一些帮助。

【问题讨论】:

  • 只是猜测,但如果class1 在超出范围时在list 之前被销毁会发生什么?

标签: c++ list boost container-data-type boost-intrusive


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 哦,是的,我搞砸了,现在可以了!谢谢你。老实说,我一直不知道声明的顺序是相反的破坏顺序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-13
  • 1970-01-01
  • 1970-01-01
  • 2017-11-13
  • 2011-04-22
相关资源
最近更新 更多