// compile with: // g++ -std=c++11 -Wall -Wextra -pedantic -Wno-ignored-qualifiers -g3 -O0 -I${BOOST_INCLUDE} unlink-header.cpp -o unlink-header #include #include #include #include #include namespace bi = boost::intrusive; struct A { A(int val = 42) : val_(val), prev_(nullptr), next_(nullptr) { std::cout << "constructing element with val_=" << val << "\n"; } ~A() { std::cout << "destroying element with val_=" << val_ << "\n"; assert(is_unlinked()); } bool is_unlinked() const { return not(prev_ or next_); } int val_; A* prev_; A* next_; }; struct Node_Traits { typedef A node; typedef A* node_ptr; typedef const A* const_node_ptr; static node *get_next(const node *n) { return n->next_; } static void set_next(node *n, node *next) { n->next_ = next; } static node *get_previous(const node *n) { return n->prev_; } static void set_previous(node *n, node *prev) { n->prev_ = prev; } }; typedef bi::trivial_value_traits< Node_Traits, bi::safe_link > Value_Traits; typedef bi::list< A, bi::value_traits< Value_Traits > > list_t; int main() { std::cout << "constructing vector\n"; std::vector< A > a_cont; a_cont.reserve(3); a_cont.emplace_back(0); a_cont.emplace_back(1); a_cont.emplace_back(2); { std::cout << "constructing list\n"; list_t l(a_cont.begin(), a_cont.end()); std::cout << "clearing list\n"; l.clear(); std::cout << "clearing vector\n"; a_cont.clear(); std::cout << "destroying list\n"; } std::cout << "done\n"; // never reached }