Assigning a static array
Ali Çehreli
acehreli at yahoo.com
Thu Apr 18 14:43:54 PDT 2013
On 04/18/2013 02:06 PM, Brad Anderson wrote:
> Is this supposed to be allowed:
>
> ubyte[] a;
> ubyte[16] b;
> a = b;
> assert(a.ptr == b.ptr);
>
> Because if so that makes it terribly easy to do a bug like this (as I
> just saw in IRC):
>
> struct A
> {
> ubyte[] a;
> this(ubyte c)
> {
> ubyte[16] b;
> b[] = c;
> this.a = b; // a now points at an immediately invalid static
> array
> }
> }
There is a similar problem with the automatically generated array arguments.
The following constructor takes any number of ints that come in array form:
import std.stdio;
struct S
{
int[] a;
this(int[] args...)
{
a = args;
}
void foo()
{
writeln(a);
}
}
void main()
{
S[] a;
foreach (i; 0 .. 2) {
a ~= S(i, i, i); // <-- WARNING temporary array
}
foreach (e; a) {
e.foo();
}
}
The program prints the following because the temporary arrays that are
generated when calling the constructors are long gone:
[1, 1, 1]
[1, 1, 1]
The programmer *may have* ;) expected the following output:
[1, 1, 1]
[2, 2, 2]
Ali
More information about the Digitalmars-d-learn
mailing list