d malloc

seany via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri Aug 8 10:07:36 PDT 2014


On Friday, 8 August 2014 at 16:51:37 UTC, H. S. Teoh via 
Digitalmars-d-learn wrote:
> On Fri, Aug 08, 2014 at 04:42:12PM +0000, seany via 
> Digitalmars-d-learn wrote:
>> consider this :
>> 
>> struct S
>> {
>> /* ... */
>> 
>> }
>> 
>> void main()
>> {
>>    ulong [] u;
>> 
>>    for(// ...
>>    {
>>       S s_instance;
>>       // fillup .. S.key = value;
>>       u ~= cast(ulong)*s_instance;
>>    }
>> 
>> }
>> 
>> however, the structs are being allocated to the same place. 
>> Because,
>> Every time the iterator ends an iteration, seemingly, 
>> s_instance is
>> collected as garbage.
>
> This has nothing to do with the GC. You're storing an address 
> to a local
> variable on the stack, which is bad idea because once it goes 
> out of
> scope, it will get overwritten by other data (such as subsequent
> instances of itself in the loop body).
>
> You need to explicitly allocate the struct on the heap with 
> 'new' if you
> want it to survive past the end of the loop body:
>
> 	S* s_instance = new S();
> 	u ~= cast(ulong)s_instance;
>
> Note that as long as you have pointers to the struct, the GC 
> will not
> collect it. So you actually don't need to worry about freeing 
> the data
> once you're done with it; just set all pointers to it to null, 
> and the
> GC will collect it for you.
>
>
> T


Okey, thank you.

And as discussed earlier, I was trying to save the pointers in an 
ulong (which is same as size_t or ptr_t, those are aliased) 
array, but both addresses 7ff11330eeb0 and 7ff11330ed00 is saved 
as 140733974163440.

What do I do?



More information about the Digitalmars-d-learn mailing list