On Tuesday, 5 November 2019 at 10:13:59 UTC, Mike Parker wrote:
On Tuesday, 5 November 2019 at 08:47:05 UTC, Ferhat Kurtulmuş
wrote:
value of int which is 0. I wonder how new memory is allocated
without an explicit malloc here. Sorry for this noob question
in advance, I could not find any doc mentioning a similar case.
int* vals = cast(int*)malloc(len * S.sizeof);
vals[0] = 4;
vals[1] = 5;
S s1 = S(vals, len);
S s2 = s1;
writeln(s2.vals[0]);
writeln(s2.vals);
writeln(s1.vals);
}
https://run.dlang.io/is/D0nfeT
Yep, it is obvious that my code is wrong. s1 and s2 point to the
same memory address. I could obtain my desired behavior with copy
constructor. The documentation also say "WARNING: The postblit is
considered legacy and is not recommended for new code. Code
should use copy constructors defined in the previous section".
struct S {
int* vals;
size_t length;
this(ref return scope S another) {
vals = cast(int*)malloc(another.length * S.sizeof);
memcpy(vals, another.vals, another.length * S.sizeof);
writeln("copied");
}
this(int* vls, size_t len){
vals = vls;
length = len;
}
~this(){
free(vals);
writeln("freedooom!");
}
}