Bug in RefCounted?

Maxim Fomin maxim at maxim-fomin.ru
Tue Oct 29 09:07:28 PDT 2013


On Tuesday, 29 October 2013 at 12:03:09 UTC, Rene Zwanenburg 
wrote:
> On Monday, 28 October 2013 at 19:40:26 UTC, Maxim Fomin wrote:
>> The fact that structs are movable and there is too few struct 
>> runtime reflection makes them noncollectable. However, you can 
>> wrap struct inside class, in such case struct dtor will be 
>> called.
>
> Yeah, if wrapping inside a class wouldn't work either we'd be 
> in a whole new world of hurt.
>
> But what do you exactly mean by noncollectable? And what does 
> movability have to do with that? I think the memory will be 
> reclaimed without a problem, so new-ing a struct without 
> destructor would be fine. This doesn't leak:
>
> struct S
> {
> 	int i;
> }
>
> void main()
> {
> 	while(true)
> 	{
> 		new S;
> 	}
> }

I would say it leaks because dtor (if defined) is not called, 
although memory is reclaimed at some point. In my opinion struct 
movability is a problem for heap struct collection because it is 
hard to say judging to struct stack/heap pointer whether it 
should be collected or not. If you look at output from previous 
example,

ctor, 1
dtor, 7FFFF7ED8FF8, 1
ctor, 2
dtor, 7FFFFFFFDB30, 1

you will see that adressess are different and refer to stack, yet 
object is in the heap. By the way, there is another issue - if 
you have delegate inside struct method touching some field, than 
invoking such delegate after returning from method may break 
memory, because delegate references 'this' struct pointer, but it 
may be changed across lifetime. I am not sure whether some 
algorithm for solving heap struct collectibility can be made, but 
I don't have any idea right now.


More information about the Digitalmars-d-learn mailing list