Deallocate array?
Matic Kukovec
matic.kukovec at pametnidom.si
Wed May 8 05:28:50 PDT 2013
On Wednesday, 8 May 2013 at 12:03:08 UTC, Steven Schveighoffer
wrote:
> On Wed, 08 May 2013 06:20:45 -0400, Matic Kukovec
> <matic.kukovec at pametnidom.si> wrote:
>
>> Was playing around with the code and found that this WORKS:
>> (note the "app_temp_array.reserve(50000000);" at the top,
>> without this line it doesn't work)
>
> [snip]
>
>> The memory usage shrinks from 400MB to 2MB, which is right!
>> Why?
>
> This is the conservative garbage collector at work.
>
> What happens is there is a "false pointer", or a word-aligned
> 32-bit value on the stack, or in global registers, that points
> at one of the arrays that you allocate.
>
> As you append, and the GC needs to allocate larger and larger
> arrays to hold your new data, the old ones are left behind for
> the GC to collect. But some random integer somewhere happens
> to "point" at one of those arrays. It is then kept in memory.
> It doesn't have to be a large array. GC.minimize can only
> shrink the OS-provided memory block, which is sequential. If
> any data is still valid, even if there is a bunch of free pages
> below that data, it cannot be returned to the OS.
>
> When you reserve, however, one, and only one, memory block is
> allocated. This block you are explictly freeing at the end, so
> it will be collected. Then minimize can do a good job.
>
> Not saying you should do things this way, just explaining the
> behavior. arr.reserve is a good tool to use when you know how
> much data you will need. But it can't fix every situation.
>
> -Steve
Thanks for the explanation Steve.
Can you please give me a correct example of:
- creating a dynamic string array
- looping over it and adding values
- discarding/releasing the array from memory
Thanks, Matic
More information about the Digitalmars-d-learn
mailing list