IMPLEMENT_DYNCREATEでメモリリーク – プログラミング – Home

通知
すべてクリア

[解決済] IMPLEMENT_DYNCREATEでメモリリーク


てんてく
 てんてく
(@てんてく)
ゲスト
結合: 20年前
投稿: 92
Topic starter  

環境
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でメモリリークしてしまうのですが
解決方法を教えてください。よろしくお願いします。


引用未解決
トピックタグ
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

主スレッドが終わる前に、
CTestThread スレッドを終了させていますか?


返信引用
てんてく
 てんてく
(@てんてく)
ゲスト
結合: 20年前
投稿: 92
Topic starter  

>主スレッド

はい。デバッガで派生クラスのデストラクタが呼ばれてからCMainFrameのデストラクタが
呼ばれるのを確認しています。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

スレッド内部の処理で「WaitForSingleObject」を使っているところはないですか?
タイムアウトは掛かる党になっていますか?
一見終わっているようにみえて実はまだ....ということがあります。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

掛かる党になっていますか?
修正
かかるようになっていますか?


返信引用
てんてく
 てんてく
(@てんてく)
ゲスト
結合: 20年前
投稿: 92
Topic starter  

スレッド内でWaitは使っていません。
グローバルのタイマは使っていますがBaseのデストラクタでKillTimerしています。

>一見終わっているようにみえて
デストラクタが呼ばれても実は終了していない、ということでしょうか?


返信引用
てんてく
 てんてく
(@てんてく)
ゲスト
結合: 20年前
投稿: 92
Topic starter  

自己解決

void Create__(CRuntimeClass* pClass)
{
// ASSERT(pClass->CreateObject()->IsKindOf( RUNTIME_CLASS(CBaseThread) ));
pThead = (CBaseThread*)AfxBeginThread(pClass);
}

と派生クラスであることを判別していたのですが
この判別部分をコメントしたらメモリリークはなくなりました。
詳しい原因は良くわかりませんがひとまず解決しました。


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

> 詳しい原因は良くわかりませんがひとまず解決しました。

> CreateObject()

ここでオブジェクト作っちゃってますけど...保存してないからこれが解放漏れしてるわけですね。


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

> と派生クラスであることを判別していたのですが

それならば、

pClass->IsDerivedFrom(RUNTIME_CLASS(CBaseThread))

でよいです。


返信引用
てんてく
 てんてく
(@てんてく)
ゲスト
結合: 20年前
投稿: 92
Topic starter  

>pClass->IsDerivedFrom(RUNTIME_CLASS(CBaseThread))
原因発見後これやりました(^^;

ヘルプに 戻り値・・(略)・・・またはメモリ不足で・・・
と書いてある時点でCreate系関数の疑いを持つべきでした orz

返信くださった皆様、ありがとうございました


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました