On Tue, 07 May 2013 19:09:28 -0400, Matic Kukovec <matic.kuko...@pametnidom.si> wrote:

Hi

I'm running Windows Vista 64 with dmd 2.062.

I have a simple program:

import std.stdio, core.memory, std.cstream;
void main()
{
        string[] temp_array;

        for(int i=0;i<5000000;i++)
        {


                ++temp_array.length;
                temp_array[temp_array.length - 1] = "aaaaaaaaaaaaaaaaaaaaa";

This is very inefficient, use temp_array ~= "aaaaaaaaaaaaaaaaaaaaa";

        }
        
        temp_array = null;

        GC.collect();
         writeln("end");      
        din.getc();
}

When the program waits at "din.getc();", memory usage in the Task Manager is 150MB.

Why isn't the memory deallocating?

The GC does not return free memory to the OS, just to free memory pools/free-lists. GC.minimize may or may not help.

But your code may not have freed that memory anyway. It is not really possible to ensure that temp_array isn't referred to. For example, the compiler could keep temp_array in a register.


P.S.;
I tried temp_array.clear() and destroy(temp_array), but nothing changed.

Neither of these will deallocate memory. All are equivalent to setting temp_array = null.

If you want to ensure deallocation, you need to free it using GC.free(temp_array.ptr). A very dangerous operation, use with caution, make sure there are no other references to that data.

-Steve

Reply via email to