GC doesn't collect where expected

Steven Schveighoffer schveiguy at gmail.com
Mon Jun 19 17:44:19 UTC 2023


On 6/19/23 12:51 PM, Anonymouse wrote:
> On Monday, 19 June 2023 at 16:43:30 UTC, Steven Schveighoffer wrote:
>>
>> In this specific case, most likely it's a stale register or stack 
>> reference. One way I usually use to ensure such things is to call a 
>> function that destroys the existing stack:
>>
>> ```d
>> void clobber()
>> {
>>    int[2048] x;
>> }
>> ```
>>
>> Calling this function will clear out 2048x4 bytes of data to 0 on the 
>> stack.
> 
> Could you elaborate on how you use this? When do you call it? Just, ever 
> so often, or is there thought behind it?

Just before forcing a collect.

The stack is *always* scanned conservatively, and even though really the 
stack data should be blown away by the next function call (probably 
GC.collect), it doesn't always work out that way. Indeed, even just 
declaring `x` might not do it if the compiler decides it doesn't 
actually have to.

But I've found that seems to help.

-Steve


More information about the Digitalmars-d-learn mailing list