anthony-arnold's answer is not incorrect, if we take some liberty with his wording, but there's something still missing.
As others have mentioned, if your Core i5 is a quad-core (are all i5's quad core?), then 25% might suggest that perhaps one of the cores (i.e. the core your process was on) is nearly 100% busy, and the others are mostly idle. Contrary to anthony-arnold's answer, the 25% does not indicate that other processes are taking up the other 75%, it's saying that the other 75% of available CPU time is simply wasted (idle). Again, if your CPU is quad core, without a multithreaded test application, your test app isn't going to be able to consume more than 25% of the whole.
If you were looking for memory space exhaustion, discounting memory allocation fragmentation and other overhead, you found it. As others suggested, your app appears to have been built as a 32-bit app. Even running on a 64-bit OS, your app will never be able to address more than the limit of what a 32-bit address space can hold, which is 4Gb. Even then, there is a lot of other overhead, including virtual address space reserved for the OS, program and shared library space, stack space, and heap space allocated to other things as well as heap space overhead. So your meegaString vector will never even get close to a full 4Gb, probably not even close to 2Gb (perhaps it might get a little over 2Gb if built as a large-address-space-aware app).
Now in regard to the "forward allocation" point that anthony-arnold mentions: All STL containers make promises about amortized operation time. The std::vector class promises that, on average (i.e. amortized), a push_back() operation will be constant time (i.e. O(1)), which means that as its contents get larger & larger, doing a push_back() will not take longer & longer to do (if it did, it would be O(n)). Occasionally it will take much more than O(1) to do a push_back(), because occasionally push_back() will cause the container's data to exceed its currently-allocated space, and it will need to perform a reallocation and move its current contents to the new location, and delete its old contents. With cooperation from the OS, a well-implemented custom-written STL implementation can do even better than that by playing tricks with virtual memory and the MMU so that it doesn't have to actually move the contents, it just tells the OS to tell the MMU to make the data's virtual memory pages map to the new location, but that's another issue entirely and you don't need to worry about it anyway, because it would happen behind the scenes. In any case, yes, the std::vector class MUST "pre-allocate" a larger block of memory than required any time it makes a new allocation, because that's the only way it can promise O(1) push_back() time. If it had to move the contents to a newly-allocated buffer every time you did a push_back(), then push_back()'s time complexity would be O(n), not O(1), because the time to do a push_back() would get longer & longer the larger the vector's data is.