アクセスカウンタ
※カテゴリー別のRSSです
インフォメーション

読者登録
メールアドレスを入力して登録する事で、このブログの新着エントリーをメールでお届けいたします。解除は→こちら
現在の読者数 1人
プロフィール
のんきよね
のんきよね
オーナーへメッセージ
のんきの日記(こちらのサイトも立ち寄ってください)

スポンサーサイト

上記の広告は2週間以上更新のないブログに表示されています。 新しい記事を書くことで広告が消せます。  

Posted by スポンサー広告 at

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()を行い、再設定します。


基本的にメモリーリークが増えなければ良いという考えもあると思います。
でも、、気持ち悪いので調べて納得して結論を出すべきと思います。  


Posted by のんきよね at 22:16Comments(0)C++