C++ Boost Intrusive List - Пример

Мне интересно узнать о навязчивых контейнерах 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());
}

Но это не может быть правдой, по крайней мере, я не вижу, где я мог случайно уничтожить объект. Я пока не знаю всех подробностей об этих контейнерах, поэтому буду благодарен за помощь.

1 ответ

Решение

Вы заявили class1 после list. Так когдаmain выходы, class1уничтожен до listявляется. (Разрушение в порядке, обратном построению.)

Вы вставили class1 в list. Так когдаlist уничтожен, class1, который все еще вставлен в контейнер, больше не жив.

Переместить объявление class1 до этого list, так что позже он будет уничтожен.

Сравните также с документацией по ускорению, из которой вы, вероятно, создали код в своем вопросе. Там объект-элемент также объявляется перед списком.

В целом примечание внизу страницы связанной документации важно. Он говорит, что контейнер хранит только ссылку и что вы должны убедиться, что вставленные элементы остаются в живых дольше, чем контейнер.

Другие вопросы по тегам