Здравствуйте, Sheridan, Вы писали:
class cobject
{
public:
cobject()
: p1(new vertexbuf())
, p2(new vertexbuf()) // <--- Вот здесь летит исключение, объект p1 подвис навеки.
{
}
virtual ~cobject()
{
delete p1;
delete p2;
}
private:
vertexbuf* p1;
vertexbuf* p2;
};
S>Почему исключение нельзя перехватить в конструкторе? Почему ты придумываешь мне редкие аварии?
Можно. Но!
1. Что ты будешь с этим исключением делать? Как ты определишь, какой из объектов кинул исключение? Они ведь неразличимы. Или ты будешь инициализацию каждого мембера в отдельности обраблять в try- catch?
2. Эту проблему нужно будет решать в КАЖДОМ классе, содережащем более одного указателя. Представь, во что превратится твой код и какое количество ошибок будет плодиться в этом аду.
3. Откуда у тебя уверенность, что эта ситуация редкая? А даже если и редкая, то что — можно игнорировать что ли?
И главное: зачем создавать сложности, когда все эти "но" разрешаются предельно просто:
class cobject
{
public:
cobject()
: p1(new vertexbuf())
, p2(new vertexbuf()) // <--- Вот здесь летит исключение - а нам насрать!
{
}
virtual ~cobject(){}
private:
shared_ptr<vertexbuf> p1;
shared_ptr<vertexbuf> p2;
};