I'm not sure if this is a legitimate bug or one of my brainfarts.

I know that if I'm using a foreach loop with a char array as a reusable 
datatype I definitely have to create a copy if I want to store it to a string.

But this code is a little more subtle, check it out (This is Windows only 
because it uses the registry, sorry):

module mymodule;

import std.stdio : writeln, write;
import std.windows.registry;

void main()
{
    Key HKLM = Registry.localMachine;
    Key SFW = HKLM.getKey("software");

    string[] names;

    foreach (Key key; SFW.keys())
    {
        string name = key.name();
        // string name = key.name().idup; // workaround for the issue
        names ~= name;
    }

    writeln("results:");
    foreach (name; names)
    {
        write(name, ", ");
    }
}

The results are quite unexpected. The strings get overwritten with each other, 
and in my case the results are similar to this:

Sun Microsystems, Sun Micros, Sun , Sun Micr, Sun, Sun Mic,...

And it goes like that for a hundred or so values, then switches to the next 
name and writes more garbage like that.

If I use .idup, the problem goes away. What I don't understand is why assigning 
a string to a string isn't safe in this case? They're both immutable, so I was 
expecting the contents of the strings never to change. 

If it's not a bug, it certainly is a subtle issue. The original foreach loop 
was quite big, and it took some time to figure out the problem. Are we *always* 
supossed to be using .idup in a foreach loop? Of course, the Key key variable 
is reused in the foreach loop, so I guess this has something to do with the 
results.

Reply via email to