Информация об изменениях

Сообщение Re[10]: Похоже, починил. от 21.12.2018 8:44

Изменено 21.12.2018 9:00 rg45

Re[10]: Похоже, починил.
Здравствуйте, 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. Что ты будешь с этим исключением делать? Как ты определишь, какой из объектов кинул исключение? Они ведь неразличимы.
2. Эту проблему нужно будет решать в КАЖДОМ классе, содережащем более одного указателя. Представь, во что превратится твой код и какое количество ошибок будет плодиться в этом аду.
3. Откуда у тебя уверенность, что это "авария" и что она редкая. А даже если и редкая, то что — можно игнорировать что ли?

И главное: зачем создавать сложности, когда все эти "но" разрешаются предельно просто:

class cobject
{
public:

  cobject()
  : p1(new vertexbuf())
  , p2(new vertexbuf()) // <--- Вот здесь летит исключение - а нам насрать!
  {
  }
  virtual ~cobject(){}

private:
  shared_ptr<vertexbuf> p1;
  shared_ptr<vertexbuf> p2;
};
Re[10]: Похоже, починил.
Здравствуйте, 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;
};