C++11 尝试学习boost::侵入式Q1

C++11 尝试学习boost::侵入式Q1,c++11,boost,C++11,Boost,我有一个从网上下载的程序。如果我在末尾添加clear,它将崩溃,并显示以下消息: idf@idf-Satellite-C55t-A ~/Documents/BOOST_INTRUSIVE/Intrusive1/bin/Debug $ ./Intrusive1 Intrusive1: /usr/local/include/boost/intrusive/detail/utilities.hpp:366: void boost::intrusive::detail::destructor_impl

我有一个从网上下载的程序。如果我在末尾添加clear,它将崩溃,并显示以下消息:

idf@idf-Satellite-C55t-A ~/Documents/BOOST_INTRUSIVE/Intrusive1/bin/Debug $ ./Intrusive1 
Intrusive1: /usr/local/include/boost/intrusive/detail/utilities.hpp:366: void boost::intrusive::detail::destructor_impl(Hook&, boost::intrusive::detail::link_dispatch<(boost::intrusive::link_mode_type)1u>) [with Hook = boost::intrusive::generic_hook<boost::intrusive::get_list_node_algo<void*>, boost::intrusive::member_tag, (boost::intrusive::link_mode_type)1u, (boost::intrusive::base_hook_type)0u>]: Assertion `!hook.is_linked()' failed.
Aborted
idf@idf-Satellite-C55t-A ~/Documents/BOOST_INTRUSIVE/Intrusive1/bin/Debug $ 
idf@idf-Satellite-C55t-A~/Documents/BOOST_INTRUSIVE/Intrusive1/bin/Debug$。/Intrusive1
Intrusive1:/usr/local/include/boost/intrusive/detail/utilities.hpp:366:void boost::intrusive::detail::destructor_impl(Hook&,boost::intrusive::detail::link_dispatch)[带Hook=boost::intrusive::generic_Hook]:断言`!hook.is_linked()'失败。
流产
idf@idf-Satellite-C55t-A~/Documents/BOOST_INTRUSIVE/Intrusive1/bin/Debug$
我不知道这意味着什么。我希望清除所有的项目,内容被删除

#include <vector>
#include <iostream>

#include <boost/intrusive/list.hpp>

using namespace boost::intrusive;

class MyClass : public list_base_hook<>   //This is a derivation hook
{
    int anInt;

public:
    //This is a member hook
    list_member_hook<> member_hook_;

    MyClass(int i)
        :  anInt(i)
    {}
};

//Define a list that will store MyClass using the public base hook
typedef list<MyClass>   BaseList;

//Define a list that will store MyClass using the public member hook
typedef list< MyClass
            , member_hook< MyClass, list_member_hook<>, &MyClass::member_hook_>
            > MemberList;

int main()
{
    typedef std::vector<MyClass>::iterator VectIt;

    //Create several MyClass objects, each one with a different value
    std::vector<MyClass> values;
    for(int i = 0; i < 100; ++i)
        values.push_back(MyClass(i));

    BaseList baselist;
    MemberList memberlist;

    //Now insert them in the reverse order in the base hook list
    for(VectIt it(values.begin()), itend(values.end()); it != itend; ++it)
        baselist.push_front(*it);

    //Now insert them in the same order as in vector in the member hook list
    for(VectIt it(values.begin()), itend(values.end()); it != itend; ++it)
        memberlist.push_back(*it);

    //Now test lists
    {
        BaseList::reverse_iterator rbit(baselist.rbegin());
        MemberList::iterator mit(memberlist.begin());
        VectIt  it(values.begin()), itend(values.end());

        //Test the objects inserted in the base hook list
        for(; it != itend; ++it, ++rbit)
            if(&*rbit != &*it)   return 1;

        //Test the objects inserted in the member hook list
        for(it = values.begin(); it != itend; ++it, ++mit)
            if(&*mit != &*it)    return 1;

        values.clear();
        //Now delete all the values. Do they dissapear from all containers?
           //Now insert them in the reverse order in the base hook list
        //for(VectIt it(values.begin()), itend(values.end()); it != itend; ++it)
        //    ;

        //std::cout << values.size();
        //std::cout << baselist.size();
        //std::cout << memberlist.size();
    }

    return 0;
}
#包括
#包括
#包括
使用名称空间boost::intrusive;
类MyClass:public list\u base\u hook//这是一个派生钩子
{
智力;
公众:
//这是一个会员卡
列出(成员)(钩子成员)(钩子);;
MyClass(int i)
:anInt(i)
{}
};
//定义一个使用公共基钩子存储MyClass的列表
类型定义列表基本列表;
//定义一个使用公共成员挂钩存储MyClass的列表
typedef列表
>成员名单;
int main()
{
typedef std::vector::迭代器VectIt;
//创建几个MyClass对象,每个对象具有不同的值
std::向量值;
对于(int i=0;i<100;++i)
值。推回(MyClass(i));
基本清单基本清单;
成员名单;
//现在,在基本钩子列表中按相反顺序插入它们
for(VectIt it(values.begin())、itend(values.end());it!=itend;+it)
基本列表。向前推(*it);
//现在,按照与成员挂钩列表中的向量相同的顺序插入它们
for(VectIt it(values.begin())、itend(values.end());it!=itend;+it)
成员列表。推回(*it);
//现在是测试列表
{
BaseList::reverse_迭代器rbit(BaseList.rbegin());
成员列表::迭代器mit(MemberList.begin());
VectIt(values.begin()),itend(values.end());
//测试插入到基本钩子列表中的对象
for(;it!=itend;++it,++rbit)
如果(&*rbit!=&*it)返回1;
//测试插入到成员挂钩列表中的对象
for(it=values.begin();it!=itend;++it,++mit)
if(&*mit!=&*it)返回1;
value.clear();
//现在删除所有值。它们是否从所有容器中消失?
//现在,在基本钩子列表中按相反顺序插入它们
//for(VectIt it(values.begin())、itend(values.end());it!=itend;+it)
//    ;

//std::cout入侵容器不拥有它们的元素。元素必须存储在带外

您所做的是删除元素,而它们仍然在逻辑上插入到(多个)入侵集合中(即,它们通过入侵挂钩链接)

在中,Boost Intrusive将在钩子结构的析构函数中实际诊断此问题,这就是为什么会收到错误消息


另请参见:

我明白了。有一个问题,假设我希望从包含该元素的所有入侵容器中删除该元素。只需对该元素调用delete就可以了吗?@Ivan我以为这是您实验的对象?()。只要在存储之前清除列表,您就可以了。下面是。请注意,清除
也会清除列表。此外,请务必阅读注意事项(例如线程)使用自动取消容器链接。sehe,再次感谢。我要耐心等待。我有更多的问题,但我想先挣扎和忍受,同时我尝试在脑海中建立所有的连接。已经在使用BOOST::Variant、BOOST::Intrusive和BOOST::lexical_cast。@Ivan我喜欢这样。我不喜欢挣扎,但我确实意识到这很难我需要学习