пятница, 23 октября 2009 г.

Deleting incomplete type

Поскольку люди стали задавать вопросы зачем вообще нужна проверка на то, что тип является полностью определенным, то разъясню этот момент подробнее.

Дело в том, что стандарт в части 5.3.5/5 разрешает удаление объектов неполностью определенных типов:
If the object being deleted has incomplete class type at the point of deletion and the complete class has a non-trivial destructor or a deallocation function, the behavior is undefined.
Продемонстрировать проблему можно на следующем простом примере:
struct X; // неполностью определенный тип (определяется позднее)

int main()
{
  X* x = 0;
  delete x; // стандарт разрешает это

  return 0;
}

struct X
{
private:
  ~X() {}; // private destructor
};
Этот код компилируется несмотря на приватный деструктор, и, очевидно, этот деструктор не вызывается. В этом и есть опасность. Приличные компиляторы выдают предупреждение в этом случае, но ошибка была бы полезнее. И функция SafeDelete обеспечивает выдачу такой ошибки.

Комментировать в ВКонтакте