Да, возможно, если new
выбрасывается в конструктор.
Деструктор тогда не будет запущен, и любые распределения, которые уже произошли, не будут выпущены.
Чтобы быть более конкретным: если какая-либо память была динамически распределена до возникновения исключения в конструкторе, утечка памяти произойдет, поскольку деструктор объекта не будет запущен.
Простая иллюстрация:
class Leaks
{
private:
data* d;
public:
Leaks()
{
data = new int;
throw 1;
}
~Leaks()
{
delete data;
}
};
Это недостатки конструкции. data
всегда будет течь здесь. Вы ничего не можете с этим поделать. (Единственный случай, когда данные не будут утечки, будет, если new
не удалось.)
С new
сам может бросить, ваш примерный код способен метать после одного или нескольких распределений, тем самым оставляя вас с утечкой.
Есть три способа решения этим:
- Не выделять память (в этой ситуации вы бы просто использовать вектор, но, очевидно, иногда нет никакого способа вокруг использования динамического распределения)
- Марки уверенный, что ваш конструктор никогда не может бросить после любых распределений памяти, или если он бросает, чтобы очистить память перед бросанием. Это будет сделать некоторые довольно неприятный код, хотя во всех, кроме самых тривиальных конструкторами
- Использование смарт-указатели
Возможно ли, чтобы конструктор 'A' выбрал исключение в этом конкретном примере? –
Я думаю, что нет утечек памяти, но будет очень просто понять утечки, если вы создадите основной код. –