Greedy memory handling

Joseph Rushton Wakeling joseph.wakeling at webdrake.net
Wed Sep 11 06:33:03 PDT 2013


On 11/09/13 15:13, monarch_dodra wrote:
> That's somewhat better, as it would allow the GC to collect my buffer, if it
> wants to, but I wouldn't actually know about it afterwards which leaves me screwed.

Just to clarify, is this buffer meant only for internal use in your function or 
is it meant to be externally accessed as well?  I'd kind of assumed the former.

Either way, isn't it sufficient to have some kind of

     if (buf is null)
     {
         // allocate the buffer
     }

check in place?  The basic model seems right -- at the moment when you need the 
buffer, you check if it's allocated (and if not, allocate it as needed); you 
indicate to the GC that it shouldn't collect the memory; you use the buffer; and 
the moment it's no longer needed, you indicate to the GC that it's collectable 
again.

It means having to be very careful to check the buffer's allocation status 
whenever you want to use it, but I think that's an unavoidable consequence of 
wanting a static variable that can be freed if needed.

The alternative I thought of was something like comparing the size difference 
between the currently-needed buffer and the last-needed buffer (... or if you 
want to be over-the-top, compare to a running average:-), and if the current one 
is sufficiently smaller, free the old one and re-alloc a new one; but that's a 
bit _too_ greedy in the free-up-memory stakes, I think.


More information about the Digitalmars-d-learn mailing list