On Monday, 4 January 2016 at 07:09:30 UTC, Minas Mina wrote: > On Sunday, 3 January 2016 at 19:29:05 UTC, Martin Nowak wrote: >> >> There is a bug. >> >> You should never do this b/c of iterator/range invalidation. >> >> foreach (key; aa.keys) >> aa.remove(key); > > The reference states that keys: "Returns dynamic array, the elements of which are the keys in the associative array". > > Isn't the array newly allocated? Hi, You are right: > void main() > { > import std.stdio; > int[int] aa; > foreach (i; 0..9) > aa[i] = i * 10; > writeln(aa); // [0:0, 6:60, 7:70, 2:20, 3:30, 1:10, 8:80, 5:50, 4:40] > > foreach (key; aa.keys) > aa.remove(key); > writeln(aa); // [] > } This would be a bug (segfault on my machine): > foreach (key; aa.byKey) > aa.remove(key); Note that, in this example, there is no need to remove every element separately, you can also just do > void main() > { > import std.stdio; > int[int] aa; > foreach (i; 0..9) > aa[i] = i * 10; > writeln(aa); // [0:0, 6:60, 7:70, 2:20, 3:30, 1:10, 8:80, 5:50, 4:40] > > aa = null; > writeln(aa); // [] > } Bastiaan.