Strange behavior when concatenating array

Steven Schveighoffer schveiguy at yahoo.com
Fri Jun 17 05:53:02 PDT 2011


On Fri, 17 Jun 2011 06:42:51 -0400, Steven Schveighoffer  
<schveiguy at yahoo.com> wrote:

> On Fri, 17 Jun 2011 00:05:56 -0400, Jose Armando Garcia  
> <jsancio at gmail.com> wrote:
>
>> It looks like the rt is not calling the postblit constructor when
>> concatenating arrays. For example, the following code:
>>
>> import std.stdio;
>>
>> struct Test
>> {
>>    this(this) { writeln("copy done"); }
>>    void opAssign(Test rhs) { writeln("assignment done"); }
>>    ~this() { writeln("destructor called"); }
>> }
>>
>> void main()
>> {
>>    Test[] tests = new Test[1];
>>    {
>>       Test test;
>>       tests ~= test;
>>    }
>>    writeln("done");
>> }
>>
>> Gives the following output:
>>
>> destructor called
>> done
>>
>> The dtr for 'Test test;' is getting call after the scope exits but the
>> postblit ctr for 'tests[0]' is never called. I believe the output of
>> this code should either be:
>>
>> done
>>
>> or:
>>
>> copy done
>> destructor called
>> done
>>
>
> You are right, postblit should be called.   
> http://d.puremagic.com/issues/show_bug.cgi?id=5272
>
> I'll look at doing a fix.

https://github.com/D-Programming-Language/druntime/pull/29

See if that helps.  On my system, your code now results in your expected  
output.

-Steve


More information about the Digitalmars-d-learn mailing list