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