Thread overview
if d-tor is called, does it means the object is gc-ed?
Oct 05, 2006
%u
Oct 05, 2006
Sean Kelly
Oct 06, 2006
Lionello Lunesu
October 05, 2006
Sorry for the stupid question, but I'm puzzled.

I have some code like this:

class A {

~this() {
  printf("d-tor\n");
}

}

And I created lots of A's.  At some point in my program I explicitly did: delete a;  for all the a's.

And the printed msg shows the d-tor is called.  But From the system monitor, I didn't see the memory usage is decreased.  So I wonder whether the memory is actually freed.

BTW, is there other way I can enforce memory free-ing?

I think the std.gc module should also provide some APIs like

ulong std.gc.allocatedMemory();  // in bytes
ulong std.gc.availableMemory();

So we can monitor the memory usage within the program itself.

October 05, 2006
%u wrote:
> Sorry for the stupid question, but I'm puzzled.
> 
> I have some code like this:
> 
> class A {
> 
> ~this() {
>   printf("d-tor\n");
> }
> 
> }
> 
> And I created lots of A's.  At some point in my program I explicitly did:
> delete a;  for all the a's.
> 
> And the printed msg shows the d-tor is called.  But From the system monitor, I
> didn't see the memory usage is decreased.  So I wonder whether the memory is
> actually freed.

Calling delete on an object will cause the GC to reclaim the memory used by that object and will call its dtor.  It is up to the GC, however, what happens to that memory.  Typically, it will be kept on hand for future allocations.

> BTW, is there other way I can enforce memory free-ing?

Calling delete is the only way to ensure an object is cleaned up, though the GC should detect nearly all unused objects in its collection run.

> I think the std.gc module should also provide some APIs like
> 
> ulong std.gc.allocatedMemory();  // in bytes
> ulong std.gc.availableMemory();
> 
> So we can monitor the memory usage within the program itself.

This certainly wouldn't be difficult to implement.


Sean
October 06, 2006
"%u" <no@where.com> wrote in message news:eg3lg4$123$1@digitaldaemon.com...
> Sorry for the stupid question, but I'm puzzled.
>
> I have some code like this:
>
> class A {
>
> ~this() {
>  printf("d-tor\n");
> }
>
> }
>
> And I created lots of A's.  At some point in my program I explicitly did: delete a;  for all the a's.
>
> And the printed msg shows the d-tor is called.  But From the system
> monitor, I
> didn't see the memory usage is decreased.  So I wonder whether the memory
> is
> actually freed.

You shouldn't worry about the memory usage shown in system monitor. The memory usage in the windows task manager, for example, is reserved Virtual Memory. This doesn't actually mean anything, since an app can reserve virtual memory as much as it wants, without consuming even a bit of physical memory.

Like Sean said, your objects will have been freed by the GC, but the virtual memory won't be freed, and why should it be freed: it doesn't actually cost anything.

L.


October 07, 2006
You can already access this information using, iirc, std.gc.getStats().  Just pull the usedsize and poolsize (used and allocated memory, respectively.)

-[Unknown]


>> I think the std.gc module should also provide some APIs like
>>
>> ulong std.gc.allocatedMemory();  // in bytes
>> ulong std.gc.availableMemory();
>>
>> So we can monitor the memory usage within the program itself.
> 
> This certainly wouldn't be difficult to implement.