2008年07月05日
CString のメモリーリーク
VC6の話です。
Dumping objects ->
strcore.cpp(118) : {522} normal block .....
Data: < 007 > 01 00 00 00 03 00 00 00 04 00 00 00
30 30 37 00
Object dump complete.
strcore.cpp(118) というメモリーリークの内容
何度か試して同じ522だったので、theAppのコンストラクタに、
_CrtSetBreakAlloc(522)を挿入しデバッグを行いました。
最初にとまったのは、_heap_alloc_dbgという関数でした。
これではわからないので、呼び出し元をたどります。
コールスタックで上にさかのぼっていくと、
strcore.cppの118行目に次のような記述があります。
pData = (CStringData*) new
BYTE[sizeof(CStringData) + (nLen+1)*sizeof(TCHAR)];
さらにさかのぼると処理は、次のような所に到達しました。
CString& CString::operator=(LPCTSTR lpsz)
この上をたどると、メモリーリークしている所に到達しました。
該当箇所は、ただ単純に CString型 = char*型している所でした。。。
CString型は扱いが厄介に感じます。
そこで、こうすればメモリーリークになるのではと
考えている事を書きたいと思います。
(注)もちろん私の勝手な見解です。根拠はありません。
1.CString型の関数を作った時。
CString hoge()等、関数の型にした時、発生した覚えがあります。
[対応]基本的に作らないようにしています。
2.スレッドを利用している時。
スレッドの終了のタイミングと関連があると感じています。
[対応]スレッド内のローカル変数や引数で渡したCString型のものは、
スレッドが終わる前に[変数名].Empty() でクリアします。
3.クラスメソッドや構造体でCString型変数を再設定する時。
パラメータ設定用メソッドと実行メソッドを別にしたクラスで、
設定メソッドにCString型の変数を渡していた場合や、
構造体内のCString型変数に対して、繰り返し設定し使用した場合。
[対応]設定前に、[変数名].Empty()を行い、再設定します。
基本的にメモリーリークが増えなければ良いという考えもあると思います。
でも、、気持ち悪いので調べて納得して結論を出すべきと思います。
Dumping objects ->
strcore.cpp(118) : {522} normal block .....
Data: < 007 > 01 00 00 00 03 00 00 00 04 00 00 00
30 30 37 00
Object dump complete.
strcore.cpp(118) というメモリーリークの内容
何度か試して同じ522だったので、theAppのコンストラクタに、
_CrtSetBreakAlloc(522)を挿入しデバッグを行いました。
最初にとまったのは、_heap_alloc_dbgという関数でした。
これではわからないので、呼び出し元をたどります。
コールスタックで上にさかのぼっていくと、
strcore.cppの118行目に次のような記述があります。
pData = (CStringData*) new
BYTE[sizeof(CStringData) + (nLen+1)*sizeof(TCHAR)];
さらにさかのぼると処理は、次のような所に到達しました。
CString& CString::operator=(LPCTSTR lpsz)
この上をたどると、メモリーリークしている所に到達しました。
該当箇所は、ただ単純に CString型 = char*型している所でした。。。
CString型は扱いが厄介に感じます。
そこで、こうすればメモリーリークになるのではと
考えている事を書きたいと思います。
(注)もちろん私の勝手な見解です。根拠はありません。
1.CString型の関数を作った時。
CString hoge()等、関数の型にした時、発生した覚えがあります。
[対応]基本的に作らないようにしています。
2.スレッドを利用している時。
スレッドの終了のタイミングと関連があると感じています。
[対応]スレッド内のローカル変数や引数で渡したCString型のものは、
スレッドが終わる前に[変数名].Empty() でクリアします。
3.クラスメソッドや構造体でCString型変数を再設定する時。
パラメータ設定用メソッドと実行メソッドを別にしたクラスで、
設定メソッドにCString型の変数を渡していた場合や、
構造体内のCString型変数に対して、繰り返し設定し使用した場合。
[対応]設定前に、[変数名].Empty()を行い、再設定します。
基本的にメモリーリークが増えなければ良いという考えもあると思います。
でも、、気持ち悪いので調べて納得して結論を出すべきと思います。