if (p) //*1
{
p->Release(); //*2
p = NULL;
}
は、マルチスレッドなら*1でp!=0でも、*2でp!=0の保証はないよ。
スタックにコピーすべき。