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