Здравствуйте, Андрей Тарасевич, Вы писали:
Второй пример понятен. А первый не понял. Посните, плиз.
АТ>АТ>class Safe
АТ>{
АТ> std::auto_ptr<MyString> ss;
АТ>public:
АТ> Safe() : ss(new MyString("ccc"))
АТ> {
АТ> ...
АТ> throw 1;
АТ> ...
АТ> }
АТ>};
АТ>
Почему вызовется деструктор члена класса, если деструктор самого класса вызван не будет?
Здравствуйте, Колян, Вы писали:
К> Почему вызовется деструктор члена класса, если деструктор самого
К> класса вызван не будет?
Деструкторы при "раскрутке" стека вызываются для полностью сконструированных
объектов. Член класса полностью сконструирован, а объект этого класса — нет.
Posted via RSDN NNTP Server 1.5 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, Awaken, Вы писали:
А>>Да, в приведенном коде delelte ss не выполниться никогда. Но это просто пример небезопастного к исключениям кода. Так делать не >надо. Если конструкотор помимо захвата каких либо ресурсов делает еще что-то что может кинуться исключением, то захват и освобождение
A>это я специально так написал чтобы проиллюстрировать потенциальную опасность исключений
В этом примере проиллюстирована потенциальная опасность не исключений, а плохого стиля программирования.
A>зы. я чаще использую ATL::CAutoVectorPtr чем auto_ptr (он массивы не уничтожает)
Прекрасно! Вы знаете что надо использовать и используете. Так почему Вас пугают исключения в конструкторе??? Не буду повторяться по поводу нормального и ненормального(исключение) завершения конструктора. См. выше. Вам по душе конструкции типа:
A a();
if(a.IsInit())
{
// do something
}
А как при таком дизайне будет выглядить деструктор? Что-то вроде:
A::~A()
{
if(IsInit())
{
// do something
}
else
{
// do something else
}
}
А если инициализация/освобождение ресурсов нетривиальны? несколько секций (возможно вложенных друг в друга) if ... else ... в деструкторе? Уродский код

Если конструктор завершился аварийно(исключение), то объект не создан, деструктор не вызывается. Если конструктор объекта написан правильно (нормальное завершение или исключение и освобождение ресурсов), то это избавит от потенциальных проблем с уничтожением объекта.
А>А если инициализация/освобождение ресурсов нетривиальны? несколько секций (возможно вложенных друг в друга) if ... else ... в >деструкторе? Уродский код
Если конструктор завершился аварийно(исключение), то объект не создан, деструктор не вызывается. Если
если нетривиально надо класс-обертку заводить в котором все это прятать