I wad confused too but looking at the definition of realloc, it will sometimes allocate adjacent memory and sometimes allocate new memory and perform a move. In which case copying the std::string values might not be valid.
Well, but std::vector always performs a move so any pointers to sub-strings won't be valid anyway from what I understand.
I am probably just not getting something but it really seems like it should just use realloc. Maybe it has something to do with thread safety though as I don't think there are any guarantees for realloc.