new in default argument will not free memory if initialization throws an exception
Because an exception could happen while creating an instance of an object, the object’s destructor must be accessible and unambiguous. If it is not, the object will not be deleted correctly. You can avoid this problem by changing the access of the object’s delete operator or compiling without exception handling (/GX–).
The following example shows an inaccessible destructor:
// compiled with (/GX)
class B {
public:
void *operator new(unsigned int);
};
class D : public B {
protected:
void operator delete(void *);
};
class E : public D {
public:
E();
~E();
};
class X {
public:
X(class E);
};
void f()
{
X x(E *e = new E); // warning C4293, delete not accessible (protected)
}