動作環境
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が立った時点ですぐに抜けることで、さらに待ち時間を減らすことができる。
別途、短い時間しか処理をしないスレッドを立てる設計は要改善事項かもしれない。
現状取り組んでいるコードにおいて上記の変更をしたところ、関連するメモリリークを取り除けた。