LoginSignup
0
0

More than 5 years have passed since last update.

memory leak > 複数台との通信 | 処理停止時 > 処理を抜ける

Last updated at Posted at 2016-08-18
動作環境
C++ Builder XE4

以下のような模擬コードがあるとする。

void func() {
   TUdpThread *work = new TUdpThread();

   for(int idx=0; idx < 7; idx++) {
      // 300msecタイムアウトの通信
   }
   work->Terminate();
}

上記の実装をしているクラスなりスレッドにて停止処理が発行されたとき、for()文の処理が途中の時、最大300msec * 7の待ちが発生する。その待ちを待たない場合にソフトが終了すると、workが開放されないことによるメモリリークが発生してしまう。FastMMにてその兆候を捉えた。

以下にすることで、待ち時間は最大300msecに減らすことができる。

void func() {
   TUdpThread *work = new TUdpThread();

   for(int idx=0; idx < 7; idx++) {
      if (m_bfStop) {
         break;
      }
      // 300msecタイムアウトの通信
   }
   work->Terminate();
}

「300msecタイムアウトの通信」の内部処理においてもm_bfStopが立った時点ですぐに抜けることで、さらに待ち時間を減らすことができる。

別途、短い時間しか処理をしないスレッドを立てる設計は要改善事項かもしれない。

現状取り組んでいるコードにおいて上記の変更をしたところ、関連するメモリリークを取り除けた。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0