Fix stack overflow in debug builds in intrusive list dtor

When destroying large intrusive lists use iteration instead of
recursion.
This commit is contained in:
John 2022-05-30 14:30:36 -07:00 committed by Jonathan Müller
commit 97a3d550c2

View file

@ -20,13 +20,31 @@ namespace detail
template <typename T>
class intrusive_list_node
{
std::unique_ptr<T> 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<T> cur(next);
next = cur->next_.release();
}
}
private:
void do_on_insert(const T& parent) noexcept
{
static_cast<T&>(*this).on_insert(parent);
}
std::unique_ptr<T> next_;
template <typename U>
friend struct intrusive_list_access;
};