我对增强型侵入式容器感到好奇,并想对其进行测试。我基本上在“如何使用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());
}
但是那不能成立,至少我看不到我可能会意外销毁该物体的地方。 我尚不了解有关这些容器的所有详细信息,因此,我很高兴在这里获得一些帮助。
答案 0 :(得分:3)
您在{em> class1
之后声明了list
。因此,当main
退出时,class1
在{em> list
被销毁之前被销毁。 (以相反的顺序破坏。)
您已将class1
插入list
中。因此,list
被销毁时,仍插入容器中的class1
不再存在。
将class1
的声明移到list
的声明之前,以便稍后将其销毁。
还可以与the boost documentation进行比较,您可能从中构造了问题中的代码。在那里,元素对象也在列表之前声明。
通常,链接的文档页面底部的注释很重要。它说容器只存储一个引用,并且您必须确保插入的元素的存活时间比容器长。