//Безопасное удаление
template<typename T>
inline void SafeDelete( T*& p )
{
// Проверка, что тип полностью определен
typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
(void) sizeof(type_must_be_complete);
// проверять p на равенство нулю не нужно, т.к. стандарт
// гарантирует корректную работу delete
delete p;
p = NULL;
}Если нет запрета на использование boost, то лучше использовать boost::checked_delete.// Безопасное удаление через Release
template<typename T, typename D>
inline void SafeRelease( T*& p, D d )
{
if ( p != NULL ) {
(p->*d)();
p = NULL;
}
}
template<typename T>
inline void SafeRelease( T*& p)
{
return SafeRelease( p, &T::Release );
}UPD:22 окт добавлена проверка на то, что тип является полностью определенным.