Сегодня рано утром я обнаружил блоки функции try-catch (фактически из здесь) и затем продолжили небольшое исследование - по-видимому, их основное использование - это исключения исключения, добавляемые списком инициализаторов конструктора.
Во всяком случае, это заставило меня задуматься о неудачных конструкторах, и я дошел до стадии, когда мне просто нужно небольшое пояснение. Я просто пытаюсь узнать больше о языке, поэтому у меня нет практического примера, но вот ...
Учитывая этот пример кода:
class A
{
private:
B b
C *c; //classes B, C & D omitted for brevity as not really relevant
D d;
public
A(int x, int y, int z)
};
A::A(int x, int y, int z)
try
: b( x )
, c( new C(y) )
, d( z )
{
//omitted
}
catch(...)
{
//omitted
}
Что происходит в этих случаях:
- Инициализация
b
вызывает исключение. - Инициализация
c
вызывает исключение. - Инициализация
d
вызывает исключение.
В частности, я хочу знать как минимум:
- что вызовет / может вызвать утечку памяти из
new C(y)
. Думаю, всего 3? (см. здесь) - не могли бы вы просто
delete b
в улове? Опасно ли в случаях 1 и 2?
Очевидно, что безопаснее всего сделать c
умный указатель. Но если на данный момент не принимать во внимание этот вариант, каков наилучший курс действий?
Безопасно ли установить c
в NULL
в инициализаторе, а затем разместить вызов new
в теле конструктора?
Тогда это будет означать, что delete c
должен быть помещен в уловку на случай, если что-то еще бросит в тело конструктора? Есть ли при этом проблемы с безопасностью (например, если это сам c = new C(y);
выбрасывает)?