Ghost in the Stack
メモリリークを取っていたが、最後の最後のヤツはこんなんだった。
次のようなコードでメモリリークする。
void UndertakeOnNewThread() {
while(true) {
Task task;
task = WaitForTask();
Process(task);
}
}
ただし、UndertakeOnNewThread は独立スレッドで実行される関数で、WaitForManager はスレッドで処理するタスクを受け付けるメソッド。新しいタスクが到着するまでブロックする。
このコードだと、task 変数のクリアは実施されない。
したがって、一番最後の Task オブジェクトは、新しいタスクが到着するまでは task ローカル変数に格納されたままである。結果的に、最後のTaskオブジェクトはリークする。.NET Framework 4.0 64bit で確認。
while文の中で宣言してるんだから、ループごとにクリアされると思ってたよ。。。常識なのかな、こんなの…。