Re: Why it is not good code for constructor
Are you sure argument of B() is evaluated no immediately before B() is
called? If, suppose, the base classes are constructed in B, A order, then if
A() throws, ~B() will be called.
"Ben Voigt [C++ MVP]" <rbv@nospam.nospam> wrote in message
news:%23K3hjF9RIHA.5524@TK2MSFTNGP05.phx.gbl...
"George" <George@discussions.microsoft.com> wrote in message
news:75F1E950-242F-46F3-9500-5BAA7FAC2AB6@microsoft.com...
Hello everyone,
Here is a sample from Dr. Dobb C++. In the analysis, the code is bad
below.
But I do not think the code is bad,
1. if bad_alloc is thrown in new int[], we just catch it and write some
log;
2. if there are any exception in B's constructor, we will also be in
catch
block and we could also write some log.
Why it is bad code? Any comments?
(I do not agree that there is resource leak, since if we met with
bad_alloc
in new int[], there is no memory allocated at all, so no root of
memory/resource leak).
The code you provided isn't sufficient to guarantee that.
What if:
class C : public B, public A
{
...
};
now if new int[n] completes ok, but the constructor for A throws, the
array is leaked with no chance to free it.
http://www.ddj.com/cpp/184401297
[Code]
C::C(int)
try
: B(new int[n]) // horrible!
{
...
}
catch(Error &e)
{
}
[/Code]
thanks in advance,
George