高見知英のかいはつにっし(β)

高見知英のアプリケーション開発日誌 のほか、地域活動などの活動報告ブログ。

Indyのメモリリーク

 TWatchを起動し、そのまま終了すると、MemCheckが必ず メモリリークしていますと言ってきます。イヤな予感がしたのでSNTP呼び出しユニットを切り離してみると、どうやらIndyのTIdSNTPが原因みたい。
ソースコードをたどっていくと、IdComponent.pasで、initialization節で生成したGStackCriticalSectionを解放していないのが直接の原因のようです。
でも、何でかなー、そのすぐ下のコメントを見ると、Freeしてはいけないみたいなことがあるんですが…。Dont Free.って、Freeするなってことですよね?あいにく主語が書いてないので、GStackCriticalSectionのことじゃないかもしれませんが…。
Googleで検索してみるとDelphi掲示板のにしのさんなんかもそう言ってらっしゃるようなので、まあ、間違いないのかなぁ…。
 で、引き続きログを探ってみても、何でそうなのかは一言も書いてないようです。一応Exciteで翻訳して見るも、いまいち意味が分からない。たぶん「順番通りに解放されないおそれがあるので、このオブジェクトを解放してはならない」みたいな意味なんだと思うんですが、はっきりとは分からず。GFPってなあに?という状態*1
 そこで、$(DELPHI)\Source\Indyにパスを通して、そこでFreeAndNil(GStackCriticalSection)ってやってみても、警告どころかエラーなんて一つも出ないです。最悪強制シャットダウンも考慮してたんですけどね(^^ゞまあ、無事なのはいいんですが。
 ――と言うことは、とりあえず今は、解放しちゃっていいのかな?

*1:それはGPFを引き起こす場合がありますだそうです