Really need some confirmation on whether I got this right or not, specifically the part where the allocator is being constructed in reallocate() and push_back().
the part where the allocator is being constructed in reallocate() and push_back().
The allocator is not constructed there, the allocator is a static data member of StrVec and is constructed, presumably, in some .cpp file.
In reallocate(), is the construct constructing empty string elements
It is moving the existing string elements from the old storage into the new storage. If you didn't push_back any empty strings, it never constructs an empty string.
Note that it leaks memory at line 44 where the pointer to the old storage is lost, and again when StrVec is destructed.