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文の中で宣言してるんだから、ループごとにクリアされると思ってたよ。。。常識なのかな、こんなの…。