Thread overview
[Issue 12915] RedBlackTree leaks memory
Jun 13, 2014
safety0ff.bugz
Jun 13, 2014
safety0ff.bugz
June 13, 2014
https://issues.dlang.org/show_bug.cgi?id=12915

--- Comment #1 from Steven Schveighoffer <schveiguy@yahoo.com> ---
Can we just null the end node's pointers on the destructor? this should dereference all the nodes.

BTW, I think there is a previous bug on that same behavior: https://issues.dlang.org/show_bug.cgi?id=5650

--
June 13, 2014
https://issues.dlang.org/show_bug.cgi?id=12915

safety0ff.bugz <safety0ff.bugz@gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |safety0ff.bugz@gmail.com

--- Comment #2 from safety0ff.bugz <safety0ff.bugz@gmail.com> ---
RedBlackTree does not guarantee that remove operations won't invalidate iterators, this guarantee is only present for inserts. So I think this is acceptable.

As you've stated, we must use _left, _right and  _parent to null out the pointers.

(In reply to Steven Schveighoffer from comment #1)
> Can we just null the end node's pointers on the destructor? this should dereference all the nodes.

This can be done in addition to Martin's solution, just call clear(). I'm not sure this will have a big impact:

The RedBlackTree's nodes form a cycle, a false pointer into any node will still cause the entire tree to be retained.

And since the begin & end pointers are always on the heap, as the number of nodes in the tree increases the likely hood of the begin & end being the ones causing the leak diminishes.

If this is a pervasive issue, perhaps a function which recursively nulls the
pointers is in order (and optionally manually deallocates.)
Nulling would invalidate iterators, manually deallocating invalidates
references.

--
June 13, 2014
https://issues.dlang.org/show_bug.cgi?id=12915

--- Comment #3 from Steven Schveighoffer <schveiguy@yahoo.com> ---
OK, I misunderstood. I thought the issue was that the red black tree itself was being pointed at, and that was causing the leak.

We certainly can null pointers as the nodes are deallocated. But the tree does not go through and destroy all the nodes if you just forget the tree (and I would argue it shouldn't). So this may solve the specific use case, but not the general one.

--
June 13, 2014
https://issues.dlang.org/show_bug.cgi?id=12915

--- Comment #4 from safety0ff.bugz <safety0ff.bugz@gmail.com> ---
(In reply to Steven Schveighoffer from comment #3)
> We certainly can null pointers as the nodes are deallocated. But the tree does not go through and destroy all the nodes if you just forget the tree (and I would argue it shouldn't).

Clear simply resets the begin & end pointers.

> So this may solve the specific use case, but not the general one.

The general case is only solved by precise GC.

We can only help specific use cases:
- Nulling on element removal.
- Manually specified complete destruction.
etc.

--
October 19, 2014
https://issues.dlang.org/show_bug.cgi?id=12915

--- Comment #5 from github-bugzilla@puremagic.com ---
Commits pushed to master at https://github.com/D-Programming-Language/phobos

https://github.com/D-Programming-Language/phobos/commit/43a1e276fe00c70239f713757f4161303f114c1d fix Issue 12915 - RedBlackTree leaks memory

https://github.com/D-Programming-Language/phobos/commit/3ebaa088eecc5322ab7bf8a80124c4ef9f4be223 Merge pull request #2625 from MartinNowak/fix12915

fix Issue 12915 - RedBlackTree leaks memory

--
February 19, 2015
https://issues.dlang.org/show_bug.cgi?id=12915

--- Comment #6 from github-bugzilla@puremagic.com ---
Commits pushed to 2.067 at https://github.com/D-Programming-Language/phobos

https://github.com/D-Programming-Language/phobos/commit/43a1e276fe00c70239f713757f4161303f114c1d fix Issue 12915 - RedBlackTree leaks memory

https://github.com/D-Programming-Language/phobos/commit/3ebaa088eecc5322ab7bf8a80124c4ef9f4be223 Merge pull request #2625 from MartinNowak/fix12915

--