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

解決


鈴木  2009-09-23 01:20:04  No: 35748

みなさんよろしくお願いいたします。
環境は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-23 02:32:29  No: 35749

Msg.Free;

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


鈴木  2009-09-23 03:18:16  No: 35750

またまた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-23 03:25:43  No: 35751

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


その  2009-09-23 05:41:27  No: 35752

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


鈴木  2009-09-23 07:20:42  No: 35753

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加