PC向けC++プログラムででスタックエラー?


template
void SafeRelease(T*& p)
{
if (p)
{
p->Release();
p = NULL;
}
}
template
void SafeDelete(T*& p)
{
if (p)
{
delete p;
p = NULL;
}
}

...

void CTakeTexture::Release( void )
{
RemoveAll();
}

void CTakeTexture::RemoveAll( void )
{
map::iterator it;
for( it = Map.begin(); it != Map.end(); it++ )
{
SafeRelease( it->second->m_lpTex );
SafeRelease( it->second ); // <-ここが原因
}
Map.clear();
}
//※注:CTakeTexture::Release()とCTakeTexture::RemoveAll()はstaticメソッドです


こんな感じのプログラムで、デバッグ実行して終了する時にスタックオーバーフローのエラーが出ていたので、スタック領域の貧弱な組み込み機じゃるまいし、何でだ?と思ったら、newで生成したCTakeTextureクラスのインスタンスをdeleteするためにSafeDelete()しなければならないところをSafeRelease()してしまい、自分のクラスに実装したのstaticメソッドのRelease()が呼ばれ、そこからRemoveAll()が呼ばれ、またそこからRelease()が呼ばれ…てな感じで、無限にメソッドの再帰的呼び出しがかかり、スタックを食いつぶし尽くしていたのでした。っつーか、再起呼び出しを実装しようとして、抜ける条件をミスった時とか、このような事故がない限り、PCプログラムでスタックオーバーフローなんて出ないよな、ふつー。
まぁ、何にせよおバカで恥ずかしいミスですな。ネタにでもなりそうなので日記に書いてみましたが(笑)。