私は現在、メモリ リークについていくつかのコードをチェックしていますが、この可能性が私を襲いました。基本的に私がやっていることの疑似コードは次のとおりです。
void thread_func()
{
char *fileName = malloc(someSize);
/* Do something with fileName and other things */
/* Enter a critical section */
modify some global variables
/*Exit critical section */
free(fileName);
return;
}
この関数は DLL 内にあります。クリティカル セクションなどは、同じ DLL 内に存在する関数によって初期化されます。
現在、私のメイン プロセス (GUI) には [キャンセル] ボタンがあります。ユーザーがそのボタンをクリックすると、DLL のクリーンアップ関数が呼び出され、クリティカル セクションが破棄されます。
の実行中にユーザーが [キャンセル] をクリックすると、 の実行thread_func()
がthread_func()
続行されることがわかりました。クリティカル セクション コードに到達すると、クリティカル セクションが無効になるため、その場で終了します。これは、スレッド内のキャンセル イベントをチェックする方法です (私のアプリケーションでは、実行中に DLL のクリーンアップを呼び出すことができないためthread_func()
)。
クリティカル セクションが無効であることがわかった場合、fileName
解放できません。thread_func()
私の推測では、メイン プロセスが終了thread_func()
してから へのアクセスが失われたためです。fileName
私の推測は正しいですか?私の主な質問は、この場合に解放しないfileName
と、メモリ リークの危険性があるかどうかです。
関連する情報をかなり検索しましたが、これまでのところ何も見つかりませんでした。誰かが私を正しい方向に向けたり、私の質問に答えたりできれば、とてもうれしいです。
ありがとう!
編集 :
kolの提案に基づいて、いくつかの予備テストを行うことにしました(以下の回答を参照)。理解できない非常に奇妙なことに気づきました。今私のコードは次のとおりです:
void thread_func()
{
char *fileName = malloc(someSize);
/* Do something with fileName and other things */
if(threadTerminated)
{
/* Cleanup */
return;
}
/* Enter a critical section */
modify some global variables
/*Exit critical section */
free(fileName);
return;
}
私の GUI では、OnCancel イベント ハンドラは次のようになります。
void OnCancel()
{
threadTerminated = TRUE;
WaitForMultipleObjects(noOfRunningThreads, threadHandles, TRUE, INFINITE);
/* Other cleanup code */
}
WaitForMultipleObjects()
無期限にハングアップし、GUI が応答しなくなることに気付きました。WaitForMultipleObjects()
はやく戻らなくちゃ?thread_func()
また、 if threadTerminated
isではクリーンアップは行われませんTRUE
。
これがIMOの最も奇妙な部分です。を削除するWaitForMultipleObjects()
と、私のコードは問題なく動作します! 内部のクリーンアップを含め、すべてのクリーンアップが行われthread_func()
ます。誰かがこれを理解するのを手伝ってくれますか?
threadTerminated
今のところ一点だけチェックしていることに注意してください。後で他の重要なポイントで確認します。何が起こっているのかを理解しているかどうかを確認するためだけにこれを行っています。
再度、感謝します!あなたの答えは非常に役に立ちます。