使用member_hook的Boost.intrusive Push_back与原始对象的地址不匹配

问题描述 投票:0回答:1

使用

list_member_hook<>
的增强侵入列表。 为什么下面的断言失败:

#include <boost/intrusive/list.hpp>
#include <cassert>

using namespace boost::intrusive;
class A
{
public:
    int i_;
    A(int i) : i_(i) {};

    list_member_hook<> m_hook1;
};

typedef list<A, member_hook<A, list_member_hook<>, &A::m_hook1> > List1;

int main()
{
    List1 list1;
    A *a = new A(10);

    list1.push_back(*a);
    assert( a == &list1.back()); //it fails, why? 

     return 0;
}
c++ boost
1个回答
0
投票

我能想到的最好的情况是你可能看到了这个断言

sotest: /home/sehe/custom/boost/boost/intrusive/detail/generic_hook.hpp:47: void boost::intrusive::detail::destructo
r_impl(Hook&, link_dispatch<boost::intrusive::safe_link>) [with Hook = boost::intrusive::generic_hook<boost::intrusi
ve::CircularListAlgorithms, boost::intrusive::list_node_traits<void*>, boost::intrusive::member_tag, boost::intrusiv
e::safe_link, boost::intrusive::NoBaseHookId>]: Assertion `!hook.is_linked()' failed.

我也得到同样的断言。失败发生是因为当

a
列表之前被破坏。 重现断言

简化示例并使其不依赖于内存泄漏:

住在Coliru #undef NDEBUG #include <boost/intrusive/list.hpp> #include <cassert> namespace bi = boost::intrusive; class A { [[maybe_unused]] int i_; public: A(int i) : i_(i) {}; bi::list_member_hook<> m_hook{}; }; using List = bi::list<A, bi::member_hook<A, bi::list_member_hook<>, &A::m_hook>>; int main() { List list; A a(10); list.push_back(a); assert(&a == &list.back()); }

修复它

在这个简单的示例中,只需切换声明顺序即可修复它:

int main() { A a(10); List list; list.push_back(a); assert(&a == &list.back()); }

	
© www.soinside.com 2019 - 2024. All rights reserved.