Re[7]: How many flows?
От: Колян  
Дата: 16.06.03 07:03
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:


Второй пример понятен. А первый не понял. Посните, плиз.

АТ>
АТ>class Safe
АТ>{
АТ>   std::auto_ptr<MyString> ss;

АТ>public:
АТ>   Safe() : ss(new MyString("ccc"))
АТ>   { 
АТ>     ...
АТ>     throw 1; 
АТ>     ...
АТ>   }
АТ>};
АТ>


Почему вызовется деструктор члена класса, если деструктор самого класса вызван не будет?
Re[7]: How many flows?
От: Awaken Украина  
Дата: 16.06.03 07:07
Оценка:
А>Да, в приведенном коде delelte ss не выполниться никогда. Но это просто пример небезопастного к исключениям кода. Так делать не >надо. Если конструкотор помимо захвата каких либо ресурсов делает еще что-то что может кинуться исключением, то захват и освобождение

это я специально так написал чтобы проиллюстрировать потенциальную опасность исключений
зы. я чаще использую ATL::CAutoVectorPtr чем auto_ptr (он массивы не уничтожает)
Re[8]: How many flows?
От: Павел Кузнецов  
Дата: 16.06.03 08:00
Оценка:
Здравствуйте, Колян, Вы писали:

К> Почему вызовется деструктор члена класса, если деструктор самого

К> класса вызван не будет?

Деструкторы при "раскрутке" стека вызываются для полностью сконструированных
объектов. Член класса полностью сконструирован, а объект этого класса — нет.
Posted via RSDN NNTP Server 1.5 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[8]: How many flows?
От: Аноним  
Дата: 18.06.03 17:46
Оценка:
Здравствуйте, 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 ... в деструкторе? Уродский код Если конструктор завершился аварийно(исключение), то объект не создан, деструктор не вызывается. Если конструктор объекта написан правильно (нормальное завершение или исключение и освобождение ресурсов), то это избавит от потенциальных проблем с уничтожением объекта.
Re[9]: How many flows?
От: Awaken Украина  
Дата: 19.06.03 07:25
Оценка:
А>А если инициализация/освобождение ресурсов нетривиальны? несколько секций (возможно вложенных друг в друга) if ... else ... в >деструкторе? Уродский код Если конструктор завершился аварийно(исключение), то объект не создан, деструктор не вызывается. Если

если нетривиально надо класс-обертку заводить в котором все это прятать
Re[10]: How many flows?
От: Аноним  
Дата: 19.06.03 08:44
Оценка:
Здравствуйте, Awaken, Вы писали:

A>если нетривиально надо класс-обертку заводить в котором все это прятать


С этим я полностью согласен. Однако вызов деструктора для "слегка готового объекта" — дурной тон. Это плохие привычки, от них надо избавляться. Просто надо внимательно писать конструктор и класс с точки зрения дизайна должен быть устойчивым к исключениям.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.