Re: Challenging GotW 66's moral
On Dec 27, 1:54 am, George2 <george4acade...@yahoo.com> wrote:
Hello everyone,
In GotW #66, one of the moral is the exception handler of constructor
should not do any like resource free task. I do not agree. Here is the
quoated moral and my code to prove this moral will have memory leak.
Anything wrong with my analysis?
http://www.gotw.ca/gotw/066.htm
Moral #1: Constructor function-try-block handlers have only one
purpose -- to translate an exception. (And maybe to do logging or some
other side effects.) They are not useful for any other purpose.
[Code]
class A
{
private:
int* p;
public:
A()
try
{
p = new int[10];
// there are some other exceptions here
}
catch (bad_alloc)
{
// do not delete since bad_alloc means memory pointed by p is
not allocated
}
catch (...)
{
// if we do not delete p, there will be memory leak
// at this point, we are conflicting with Gotw 66's moral 1
if (p) delete[] p;
at this point, p would never be 0 (even if the new allocation in ctor
body was not processed yet).
Pointer p, as is, has either a valid address or garbage in it.
As far as that catch block is concerned, it'll always delete [] p.
So how about:
A() : p(0)
try
{
p = new int[10];
}
catch(...)
{
if (p) delete[] p;
}
have you considered shared_ptr instead of doing decadent new
allocations?