使用
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;
}
我能想到的最好的情况是你可能看到了这个断言
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());
}