環境
win2k, vc++6.0 MFC
CWinThreadを派生した
CBaseThread : public CWinThread
{
DECLARE_DYNCREATE(CBaseThread)
...
};
(.cpp内)
IMPLEMENT_DYNCREATE(CBaseThread, CWinThread)
があります。
これを派生した
CTestThread : public CBaseThread
{
DECLARE_DYNCREATE(CTestThread)
...
};
(.cpp内)
IMPLEMENT_DYNCREATE(CTestThread, CBaseThread) //メモリリーク発生
この派生を使うとIMPLEMENT_DYNCREATEでメモリリークしてしまうのですが
解決方法を教えてください。よろしくお願いします。
主スレッドが終わる前に、
CTestThread スレッドを終了させていますか?
>主スレッド
はい。デバッガで派生クラスのデストラクタが呼ばれてからCMainFrameのデストラクタが
呼ばれるのを確認しています。
スレッド内部の処理で「WaitForSingleObject」を使っているところはないですか?
タイムアウトは掛かる党になっていますか?
一見終わっているようにみえて実はまだ....ということがあります。
掛かる党になっていますか?
修正
かかるようになっていますか?
スレッド内でWaitは使っていません。
グローバルのタイマは使っていますがBaseのデストラクタでKillTimerしています。
>一見終わっているようにみえて
デストラクタが呼ばれても実は終了していない、ということでしょうか?
自己解決
void Create__(CRuntimeClass* pClass)
{
// ASSERT(pClass->CreateObject()->IsKindOf( RUNTIME_CLASS(CBaseThread) ));
pThead = (CBaseThread*)AfxBeginThread(pClass);
}
と派生クラスであることを判別していたのですが
この判別部分をコメントしたらメモリリークはなくなりました。
詳しい原因は良くわかりませんがひとまず解決しました。
> 詳しい原因は良くわかりませんがひとまず解決しました。
> CreateObject()
ここでオブジェクト作っちゃってますけど...保存してないからこれが解放漏れしてるわけですね。
> と派生クラスであることを判別していたのですが
それならば、
pClass->IsDerivedFrom(RUNTIME_CLASS(CBaseThread))
でよいです。
>pClass->IsDerivedFrom(RUNTIME_CLASS(CBaseThread))
原因発見後これやりました(^^;
ヘルプに 戻り値・・(略)・・・またはメモリ不足で・・・
と書いてある時点でCreate系関数の疑いを持つべきでした orz
返信くださった皆様、ありがとうございました