.dup on an array of BitArray not duplicating

ixid nuaccount at gmail.com
Tue May 15 13:26:11 PDT 2012


On Tuesday, 15 May 2012 at 20:16:28 UTC, Chris Cain wrote:
> On Tuesday, 15 May 2012 at 19:23:31 UTC, ixid wrote:
>> Not sure if this is a bug or just rather counter-intuitive:
>>
>> BitArray test;
>> test.length = 7;
>> BitArray test2 = test.dup;
>> test2[0] = 1;
>>
>> This is fine, test is not modified.
>>
>> BitArray test[7];
>> foreach(ref i;test)
>>    i.length = 7;
>> BitArray[7] test2 = test.dup;
>> test2[0] = 1;
>>
>> test has been modified. Why doesn't dup work here?
>
> dup doesn't make a deep copy. That is to say, you have a dup'd 
> array of items that have not had dup called on them.
>
> BitArray (? Are you using D1?) apparently uses pointer to its 
> payload. In the first case, you're using BitArray's dup 
> property which knows to create a new payload with the same 
> values as the original.
>
> The second case, you call dup on the static array of BitArrays 
> which makes an exact bit-for-bit copy of the BitArray structs 
> in the array. So, you're getting a new "BitArray" struct which 
> has the exact same information (in this case, including a 
> pointer) as the old BitArray.
>
> So, when you call opAssign (using the test2[0] = 1;), it 
> modifies the payload of the first BitArray, which transitively 
> means that the first BitArray in test also sees the change 
> (because it is using a pointer to the same payload).
>
>
> Also, just as an aside, your first and second examples don't 
> mean exactly the same thing when you do "test2[0] = 1;" In the 
> first one, you're (probably) using BitArray's opIndexAssign and 
> the second one, you're just using BitArray's opAssign.
>
> An equivalent call for the second example would be:
> test2[0][0] = 1;
>
> Which would still have the same problem as you'd still be 
> modifying the payload being pointed at. But it's just something 
> to mention.

Sorry I made a typo in the second, it should be test2[0][0]. I'm 
using std.bitmanip in D2.


More information about the Digitalmars-d-learn mailing list