Manual Deletion from Destructor
dsimcha
dsimcha at yahoo.com
Sat Mar 14 11:42:27 PDT 2009
== Quote from Andrei Alexandrescu (SeeWebsiteForEmail at erdani.org)'s
> Any statistics about the amount of slack memory due to false pointers
> would be appreciated.
> Andrei
This is a corner case, but run the following code:
import std.stdio, core.memory;
void main() {
foreach(count; 1..uint.max) {
test;
GC.collect; // Make it explicit to make absolutely sure GC is running.
writeln(count);
}
}
// Marked as pure to emphasize that it's not escaping someArray to anywhere,
// so when test() goes out of scope, someArray is safe to GC.
void test() pure {
auto someArray = new uint[15_000_000];
}
Disclaimer: My understanding is that this may work differently on Linux, but if
you run it on Win32, it runs out of memory after about 20 iterations.
I don't know about the average, but the worst cases are occasionally bad enough to
make me eventually run out of 32-bit address space on stuff that should only be
using ~150 megs of RAM, unless I manually delete a few large data structures.
Associative arrays seem to be the worst problem because:
1. They generate a lot of false pointers.
2. They can often be large.
3. If even a few nodes don't get freed properly, they can fragment the heap severely.
More information about the Digitalmars-d
mailing list