std::string::reserve()

Paolo Carlini pcarlini@suse.de
Thu Feb 12 15:34:00 GMT 2004


Neil Ferguson wrote:

> What if someone does:
>
> string s("abc");
>
> char& c(s[1]);  <--- s becomes leaked
>
> s.reserve();    <--- no reallocation needed, so no _M_clone(), but
>                      _M_set_sharable() before return - s "un-leaked"
>
> string t = s;   <--- s is refcopied
> c = 'z';        <--- here we alter both s and t
>
> with no reallocation taking place, the character reference is still to
> a valid location, so no segfault or valgrind-type catch. Whereas if
> reserve() leaves s leaked, it won't be refcopied and this stays safe.

Your line of reasoning can be applied to all the member functions and
then we have a perfectly "safe" situation that... doesn't use refcopy
at all, never!!!

I mean, seriously, have a look at 21.3 and the example therein: non-const
member functions (like reserve, or append assign, replace, etc.) *are*
supposed to invalidate references, pointers, iterators and the user cannot
safely use a reference after a reserve!

The standard is like this exactly because wants to make possible an
efficient refcopied implementation.

Paolo.



More information about the Libstdc++ mailing list