Segfault with std.container.Array but not regular dynamic array

Dan dbdavidson at yahoo.com
Wed Nov 28 05:09:35 PST 2012


On Monday, 26 November 2012 at 15:44:42 UTC, Joseph Rushton 
Wakeling wrote:
> Hello all,
>
> I'm writing some code which is meant to represent a network of 
> linked nodes.
[snip]

Ok, another follow up. I can reproduce your segfault using your 
posted code, it is included below. But the interesting thing is, 
I was doing the "testing" out of your Network!Node2 in a unittest 
section. By whittling down, the smallest crash case I could come 
up with is this:

import std.typecons;
import std.stdio;
alias RefCounted!(int) Foo;
unittest {
   Foo[int] map;
   map[1] = Foo();
}

When I change that unittest block to a 'void main()' it works 
just fine. I tried the same change of unittest to 'void main()' 
on your code and found the same results - no crash. I think the 
crash issue might not be with map (even though Maxim found some 
troubling stuff with uninitialized structs being destructed when 
inserting a key that is not present). Or maybe it is just a map 
problem and by switching to main I am just getting lucky in not 
getting a crash.

It would be interesting to know if Joseph was doing his "testing" 
out in unittest or in a main.

Thanks
Dan

Here is the code that crashes. Change unittest to 'void main()' 
and it works??

-------------------
import std.container;
import std.stdio;

struct Link {
   int id;
   this(int i) { id=i; }
}

struct Node1
{
   uint id;
   Link[] links;

   this(uint id)
   {
     this.id = id;
   }

   void addLink(uint l)
   {
     links ~= Link(l);
   }
}

struct Node2
{
   uint id;
   Array!(Link) links;

   this(uint id)
   {
     this.id = id;
   }

   void addLink(uint l)
   {
     links.insert(Link(l));
   }
}
struct Network(Node)
{
   Node[uint] nodes;

   void add(uint i, uint j)
   {
     if((i in nodes) is null)
       nodes[i] = Node(i);
     if((j in nodes) is null)
       nodes[j] = Node(j);

     nodes[i].addLink(j);
     nodes[j].addLink(i);
   }

   void print()
   {
     foreach(k; nodes.keys)
       {
         write("[", k, "]");
         foreach(l; nodes[k].links)
           write(" ", l.id);
         writeln();
       }
     writeln();
   }
}

unittest {
   Network!Node2 net2;
   net2.add(1, 7);
   writeln(net2);
}



More information about the Digitalmars-d-learn mailing list