Running out of memory

FG home at fgda.pl
Thu Dec 27 11:59:16 PST 2012


On 2012-12-27 16:31, bearophile wrote:
> Don't cast arrays arrays to pointers, it's unclean, because dynamic arrays are
> two words long. Use the .ptr property:
>
> GC.free(s.ptr);

Things appeared sorted out, but it's not over yet. delete still wins.
Performance-wise free() worked like delete, but there's a nasty glitch.
The following code crashes after a few hundred loops with
core.exception.InvalidMemoryOperationError.

     import std.stdio, core.memory;
     char[1000] filler = '.';
     int fill_times = 10000;
     void main(string[] args) {
         char[] s;
         for (int i=0; i < 100000; i++) {
             for (int j=0; j < fill_times; j++)
                 s ~= filler;
             writeln("loop ", i + 1, ", length: ", s.length);
             stdout.flush();
             // delete s;
             GC.free(s.ptr);
             s = [];
         }
     }


Surprisingly, when fill_times >= 3736, it always crashes after the 341th loop 
(relies on the filler having 1000 bytes. Some other numbers also trigger it).
What could be responsible for this odd behavior of free()?


More information about the Digitalmars-d-learn mailing list