Strange rbtree behaviour

Arafel via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu Jul 7 02:55:45 PDT 2016


On Thursday, 7 July 2016 at 09:46:25 UTC, Lodovico Giaretta wrote:
> On Thursday, 7 July 2016 at 09:40:57 UTC, Lodovico Giaretta 
> wrote:
>> Initially it looks very surprising, but then if you add 
>> `writeln(B.init.col[]);` you can easily find out what's going 
>> on.
>>
>> And I'm quite sure it's expected behaviour.
>
> An RBTree is just a pointer to the memory containing the actual 
> tree. Your `col`s have different addresses because they are 
> different copies of the same pointer. If you cast `col` to a 
> pointer and write the address it's pointing at, you find out 
> that the two structures are pointing to the same memory.
>
> This is because assignments used in a structure declaration are 
> not re-executed for each instantiation. Instead, they are 
> executed one to create the `.init` member of the type, which is 
> then bit-copied on every other instance. So your code does this:
>
> B.init.col = new RBTree(...);
>
> B b1 = B.init;
> B b2 = B.init;

Still, if I make B a class instead of a struct (and instantiate 
using new), I get the same result... Do classes behave the same 
as structs in this regard? I mean, static initializers compared 
to "this" (now that I write it, I guess the word "static" gives 
an important clue...).

Anyway, glad to know what was happening... still a bit 
unintuitive, but I guess it makes sense after all.

Thanks!!


More information about the Digitalmars-d-learn mailing list