> I don't think this is debatable. There's no memory invalidation.

Okay, sorry, but let's try another way ;) Say the `free` problem cannot occur due to some kind of hidden law.

There is this little pointer to pointers of variable length `gr_mem`. These pointers, when switching from a large group to a small group, are probably partially overwritten with string data (at least that's a very realistic scenario, if the suggested internal static buffer is used as a kind of memory pool). Now not only that if we stored a slice to the old pointer array, we have some invalid pointers in the slice, but this also means that, translated to D, there was some effective pointer casting going on internally (char** now interpreted as char*) when the memory layout changed, which is forbidden in safeD.