//Безопасное удаление
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 окт добавлена проверка на то, что тип является полностью определенным.
Я тоже себе когда-то писал такой же точно SafeRelease, и даже назвал его точно также (сказалось влияние Microsoft DirectX SDK, в котором вовсю использовался макрос с таким названием).
ОтветитьУдалитьТолько потом в него добавил проверку наподобие бустовской на то, является ли тип complete, после пары случаев когда на это напоролся.
В предыдущем сообщении имелась ввиду проверка для SafeDelete конечно же.
ОтветитьУдалитьСпасибо за замечание, обновил сообщение.
ОтветитьУдалить>>Если нет запрета на использование boost, то лучше использовать boost::checked_delete.
ОтветитьУдалитьПочему?
Чтобы не изобретать велосипед. Лучше в своем шаблоне написать checked_delete вместо двух строк с большим комментарием зачем они там.
ОтветитьУдалить