Здесь есть подобный вопрос , который охватывает то, что вы спрашиваете.
В этом случае, если вызов new
завершится неудачно, память для указателя будет гарантированно освобождена. Если вызов завершится успешно, и после этого сработает конструктор, у вас будет утечка памяти.
Деструктор класса не будет вызван, потому что объект никогда не был полностью построен. Есть два способа исправить это.
1)
Имейте полностью управляемые исключения в конструкторе:
class Foo
{
public:
Foo()
try
{
p = new p;
throw /* something */;
}
catch (...)
{
delete p;
throw; //rethrow. no memory leak
}
private:
int *p;
};
2)
Или используйте умный указатель. Когда конструктор введен, все его члены были построены. И потому, что когда конструктор выбрасывает объекты и члены конструируются, они должны быть уничтожены. И умный указатель исправляет это:
class Foo
{
public:
Foo() :
p(new int)
{
throw /* something */;
}
private:
std::auto_ptr<int> p;
};