diff --git a/include/cppast/detail/intrusive_list.hpp b/include/cppast/detail/intrusive_list.hpp index ac83239..a6ef5fb 100644 --- a/include/cppast/detail/intrusive_list.hpp +++ b/include/cppast/detail/intrusive_list.hpp @@ -20,13 +20,31 @@ namespace detail template class intrusive_list_node { - std::unique_ptr next_; + public: + intrusive_list_node() = default; + intrusive_list_node(intrusive_list_node&&) = default; + intrusive_list_node& operator=(intrusive_list_node&&) = default; + + ~intrusive_list_node() noexcept + { + // Free iteratively to avoid stack overflow in debug builds. + auto next = next_.release(); + while (next) + { + std::unique_ptr cur(next); + next = cur->next_.release(); + } + } + + private: void do_on_insert(const T& parent) noexcept { static_cast(*this).on_insert(parent); } + std::unique_ptr next_; + template friend struct intrusive_list_access; };