みなさんよろしくお願いいたします。
環境は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;
Msg.Free;
を
> end;
> IdPOP31.Disconnect;
の前に挿入するのは、いかがですか?
またまた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;
追記
メモリーチェッカーのコメントを見ることができました。
ADDRESS | 未解放領域1(推定クラス名:TCriticalSection)(size:28)
と表示していますが参考になりませんか。
よろしくお願いします。
メモリーリークは Indy9のバグによるもので、
解決策は Indy10の最新バージョンにすることだと思う。
そのさん。ありがとうございました。
やはりそうですか。
要因になりそうな箇所を削っていって最後になっても
まだ、リークするのでもうお手上げでした。
Indy10のインストに挑戦してみます。
ありがとうございました。
ツイート | ![]() |