pop3のメール受信でメモリーリークの原因がわからない?

解決


鈴木  2009-09-22 16:20:04  No: 35748  IP: 192.*.*.*

みなさんよろしくお願いいたします。
環境はwindows xp Delphi6 Personal にIndy9をDLしインストールしました。
http://www.wwlnk.com/boheme/delphi/tips/tec1610.htm
の「IdPOP3でメールを受信する」でメール受信の勉強をしております。
サンプルをコピペして動かしているのですが
どうしても、メモリーリークの原因がつかめません。
原因、対処法を教えていただきたいのですが。
よろしくお願いいたします。
jconvert.pasは
http://www.geocities.jp/janeiyayo/files.html
さんのものを使わせていただきました。
ボタンと、tmemoとTpop3を使用しました。
uses
  jconvert ;
procedure TForm1.Button1Click(Sender: TObject);
var
  Msg : TIdMessage;
  i, x : integer;
  s : string;
begin
  IdPOP31.Host    :=  '***.***.yahoo.co.jp';
  IdPOP31.Port    :=  110;
  IdPOP31.UserName  := 'xxxxxxx';
  IdPOP31.Password:=  'yyyyyyyyy';
  IdPOP31.Connect;

  for i :=  1 to  IdPOP31.CheckMessages do
  begin
    Msg :=  TIdMessage.Create(Self);
    IdPOP31.Retrieve(i, Msg);
    Memo1.Lines.Add(Msg.Subject);
    for x :=  0 to  Pred(Msg.MessageParts.Count) do
    begin
      if Msg.MessageParts.Items[x] is TIdText then
      begin
        s :=  TIdText(Msg.MessageParts.Items[x]).Body.Text;
        Memo1.Lines.Add(jconvert.ConvertJCode(s, SJIS_OUT));
      end;
    end;
  end;
  IdPOP31.Disconnect;
end;

編集 削除
igy  2009-09-22 17:32:29  No: 35749  IP: 192.*.*.*

Msg.Free;

>  end;
>  IdPOP31.Disconnect;
の前に挿入するのは、いかがですか?

編集 削除
鈴木  2009-09-22 18:18:16  No: 35750  IP: 192.*.*.*

またまたigyさん、レスありがとうございます。
考え方としては、msgを取り出すごとにfreeにするんですね。
しかし私の環境では解決しません。
極端なテストとして下記の部分を全部削除して
接続と切断だけでもメモリーリークします。
何かIndy接続のしきたりがあるのでしょうか?
素人ですから、とてつもなく当たり前のことをしていないとか?
すみませんよろしくお願いします。

 for i :=  1 to  IdPOP31.CheckMessages do
  begin
    Msg :=  TIdMessage.Create(Self);
    IdPOP31.Retrieve(i, Msg);
    Memo1.Lines.Add(Msg.Subject);
    for x :=  0 to  Pred(Msg.MessageParts.Count) do
    begin
      if Msg.MessageParts.Items[x] is TIdText then
      begin
        s :=  TIdText(Msg.MessageParts.Items[x]).Body.Text;
        Memo1.Lines.Add(jconvert.ConvertJCode(s, SJIS_OUT));
      end;
    end;
  end;

編集 削除
鈴木  2009-09-22 18:25:43  No: 35751  IP: 192.*.*.*

追記
メモリーチェッカーのコメントを見ることができました。
ADDRESS | 未解放領域1(推定クラス名:TCriticalSection)(size:28)
と表示していますが参考になりませんか。
よろしくお願いします。

編集 削除
その  2009-09-22 20:41:27  No: 35752  IP: 192.*.*.*

メモリーリークは Indy9のバグによるもので、
解決策は Indy10の最新バージョンにすることだと思う。

編集 削除
鈴木  2009-09-22 22:20:42  No: 35753  IP: 192.*.*.*

そのさん。ありがとうございました。
やはりそうですか。
要因になりそうな箇所を削っていって最後になっても
まだ、リークするのでもうお手上げでした。
Indy10のインストに挑戦してみます。
ありがとうございました。

編集 削除