
Kazutoshi Satoda skrev:
Thanks for the follow ups.
Now I noticed that the problem is not only in ptr_map::insert(). The same problem seems wide spread in the whole ptr_container library.
I'll make the following 2 tickets in boost trac if nobody objects nor gives better suggestion.
1. (Type: Bugs) False strong guarantee in ptr_container documentation
Right, it should be replaced with the basic guarantee and a note saying the object is deleted when an exception is thrown.
2. (Type: Feature Requests) Provide strong guaranteed overloads in ptr_container
Hm. Do you propose to break the existing interface?
Steven Watanabe wrote:
David Abrahams wrote:
I think the implementation of ptr_map::insert is probably as correct as can be in doing that deletion (i.e. the docs are wrong, not the implementation), but if I had written ptr_map I'd have given it an auto_ptr parameter instead.
There is an overload that takes an auto_ptr.
Yes, but unfortunately, it doesn't provide strong guarantee, as same as the raw pointer version.
And also, the current auto_ptr pass-by-value version can be a error-prone.
An casual user of ptr_map will likely write a code at first like this:
map.insert(some_key(...), new value(...));
This doesn't compile by design. Then the user will look for the docs to find alternative ways, find the auto_ptr version, and modify the code to shut off the strange compile error, like this:
map.insert(some_key(...), std::auto_ptr<value>(new value));
This does compile, with the risk of subtle memory leaks. But the user can hardly notice the problem, and would think, "Aha, I can guess, the use of auto_ptr is the fix for exception-safety problem which the FAQ mentions. The library taught me that with the error. So nice."
People need to initialize smart pointers in seperate statements. -Thorsten