WindowsプログラマのWebアプリへの挑戦日記。あとパンとか。

スレッドを_endthreadで終わったらメモリリーク

3月 18th, 2008 Posted in C++

c++のスレッドの話。

今回はまったのは、_beginthreadで開始したスレッドを終了するとメモリリークが発生していた件。

ざっと見た感じ解放忘れとかなさそうな感じだったので原因の発見に時間がかかった。

スレッドの最後で_endthreadをコールしていたんだけど、これをコメントアウトするとメモリリークが消えた。

なんで?と思って調べてみると、簡単なことだった。

例えば次のような関数を_beginthreadで呼んだとする。

  1. void ThreadFunction( void* )
  2. {
  3. CString strFilePath = "G:\\test.mp3";
  4.  
  5. //MP3を再生する関数
  6. PlayMp3( strFilePath );
  7.  
  8. _endthread();
  9. }

あ、VCです。

strFilePathのスコープは関数内で、この関数を抜けるときにデストラクタが呼ばれる。

つまり、関数の最後の”}”まで行けばstrFilePathのデストラクタが呼ばれて幸せなんだけど、_endthread()で強引にスレッドを抜けてしまうと、デストラクタが呼ばれずにメモリリークしてしまう。

こんな簡単なコードだとわかりやすいんだけど、これが実際のコードとなるとぜんぜん気づかない・・・。

以後気をつけます。

こちらもオススメ!

Trackback URL

  1. 3 Responses to “スレッドを_endthreadで終わったらメモリリーク”

  2. By sora on 4月 3, 2008

    へー、そうなんすね。
    ポインタでnew()/deleteで明示的にしたら良かったりするんですかね?
    今度タメしてみよ。

  3. By ヨスケ on 4月 4, 2008

    試してないけど、ポインタでちゃんとdeleteしとけばぜんぜん問題ないはず。

  1. 1 Trackback(s)

  2. 6月 22, 2011: 黒翼猫のコンピュータ日記 2nd Edition

Post a Comment