The original code was accessing bad data in the pathological case of
int foo[1024*1024*1024] which just happens to represent 2^32 bytes.
This was generating a bad unsigned size variable in StringMap that
was then used for memory allocation.
It turns out that StringMap's allocator was using unsigned values
when the size() operator in the class returns size_t. It seems safest,
just to use size_t when dealing with strings and their lengths.