Re: How to make this exception-safe
On 20 Nov., 21:46, Triple-DES <DenPlettf...@gmail.com> wrote:
On 19 Nov, 21:24, peter koch larsen <peter.koch.lar...@gmail.com>
wrote:
On 18 Nov., 19:43, Triple-DES <DenPlettf...@gmail.com> wrote:
Consider the following code:
#include <vector>
struct C {
explicit C(int) {} // may throw
private:
C(const C&);
C& operator=(const C&);
};
struct V {
V() {
// may leak if push_back or C::C(int) throws
v_.push_back( new C(2) );
v_.push_back( new C(1) );
v_.push_back( new C(3) );
}
I don't see how this might leak. Can you explain why you believe it
does?
I am sure it does:
in V::V()
{
v_.push_back( new C(2) ); // ok
v_.push_back( new C(1) ); // ok
v_.push_back( new C(3) ); // C::C() threw exception!} // we have lost all pointers to the two C objects. (V vas never
constructed, so the v_ member can't be referenced).
That is correct - I overlooked the fact that the throw would cause the
destruct to not run (as well as the fact that a resize failure in
std::vector could also give problems, but that was not your point, I
believe).
The real solution is to encapsulate your pointer-vector in a separate
class, being responsible for deallocation of the pointers as well as
handling the problem you inevitably are going to have with the copy-
constructor and assignment operator. Alternatively, could store smart
pointers instead of raw pointers.
I believe that boost has a pointercontainer that is ready for use.
/Peter
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]