dynamic array + copy ctor
Tejas
notrealemail at gmail.com
Mon Dec 20 04:01:00 UTC 2021
On Sunday, 19 December 2021 at 22:29:21 UTC, vit wrote:
> Hello,
> Why is copy ctor in this example not called?
>
> ```d
> import std.stdio;
>
> struct Foo {
> int i;
>
> this(int i){
> this.i = i;
> writeln("init: ", i);
> }
>
> this(ref typeof(this) rhs){
> this.i = rhs.i;
> writeln("copy: ", i);
> }
> ~this() {
> writeln("~dtor:", i);
> }
> }
>
> void main(){
> Foo[] foos;
>
> foos ~= Foo(1);
>
> while(foos.capacity > foos.length)
> foos ~= Foo(0);
>
> foos ~= Foo(2);
>
> import core.memory;
> GC.collect();
> }
> ```
> result:
> ```
> init: 1
> init: 2
> ~dtor:1
> ~dtor:2
> ~dtor:1
> ```
>
> First Foo is destructed 2x.
Yeah, Stanislov is right, it's using a blit rather than a copy
constructor:
```d
import std.stdio;
struct Foo {
int i;
this(this){
writeln("blit: ", i);
}
this(int i){
this.i = i;
writeln("init: ", i);
}
this(scope ref Foo rhs){
this.i = rhs.i;
writeln("copy: ", i);
}
~this() {
writeln("~dtor:", i);
writeln("~dtor:", &this);
}
}
void main() {
Foo[] foos ;
foos ~= Foo(1);
foos ~= Foo(2);
}
/+ Output:
init: 1
init: 2
blit: 1
~dtor:1
~dtor:7EFE0DCD3000
~dtor:2
~dtor:7EFE0DCD4004
~dtor:1
~dtor:7EFE0DCD4000
+/
```
More information about the Digitalmars-d-learn
mailing list