なぜWindowsコンソールアプリケーションリークがアイドリング時にしますか? (そして、なぜ?? kernel32.dllので喫煙ガンポイントを行います)

StackOverflow https://stackoverflow.com/questions/2206930

質問

私は毎分かそこら約4キロバイトのプライベートメモリをリークしているように見える窓のマルチthrededコンソールアプリケーションを持っています。

漏れが停止するまでのリークをローカライズするための努力で、私は徐々にアプリケーション内の各スレッドを停止している、と私の驚きに犯人が「Win32Thread」という名前のスレッドのようです。

これは私が明示的に開始しているスレッドのように見えません。

私は、添付したアプリケーションを破る場合は、

、スタックトレースは次のようになります:

    ntdll.dll!_KiFastSystemCallRet@0()  
    ntdll.dll!_NtCancelTimer@8()  + 0xc bytes   
    ntdll.dll!_RtlpResetTimer@12()  + 0x15 bytes    
>   ntdll.dll!_RtlpServiceTimer@12()  + 0xfd bytes  
    ntdll.dll!_KiUserApcDispatcher@16()  + 0x25 bytes   
    kernel32.dll!_BaseThreadStart@8()  + 0x34 bytes 

これは突然に漏れなぜ誰もが任意のアイデアを持っていますか?

WIN2K3 SP2のデュアルコアシステムで約40hrsのために実行されて、アプリケーションを。

すべてのアイデアはgreately評価されています。

役に立ちましたか?

解決

それはタイマーに関連するコードでありますように

そのスタックトレースが見えます。私はあなたのコード(または使用ライブラリ)がtimeSetEventまたは同様の機能を使用して、タイマーを開始したことを推測すると思います。その場合には、リークはおそらくあなたのタイマーコールバック関数になります。

マルチメディアタイマーを起動すると、スレッドが作成されます、そして、あなたのコールバックがそのスレッドから呼び出されます。アイドリングしながら、それが漏れた理由周期タイマーを説明するだろう。

他のヒント

あなたのアプリケーションは、任意の抗原提示細胞(非同期プロシージャコール)またはスケジュールタイマーイベントを持っていますか? マルチメディアタイマーコールバックだろう。

あなたのコールバックはCランタイム・コールを使用している場合、これらの呼び出しは(_tcstol、sprintfのなど)自分の仕事をするために(遅延し、割り当てられた最初の時間は、関数がスレッドで呼び出された)一回限りのスレッドローカルな割り当てを行います。スレッドが(beginthreadで開始)またはbeginthreadex()されなかったため、スレッドが死ぬときに、このメモリをクリーンアップすることができないので、それはリークとして現れるだろう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top