Дело в том, что стандарт в части 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 обеспечивает выдачу такой ошибки.