Если вы ищете определение, вы обнаружите, что
#define SAFE_RELEASE(p) { if ( (p) ) { (p)->Release(); (p) = 0; } }
#define SAFE_DELETE(a) if( (a) != NULL ) delete (a); (a) = NULL;
SAFE_DELETE следует использовать для памяти, выделенной с новым
SAFE_RELEASE следует вызывать для com-объектов (например, объектов directx) и "под капотом "doind что-то вроде этого
if (--ref_cnt==0)
{
delete this;
}
уменьшает счетчик ссылок и освобождает объект, если на него больше нет ссылок.