MemCheckが正しく動作しないケース


かとちん  URL  2004-12-15 07:49:33  No: 12314  IP: [192.*.*.*]

知っていましたでしょうか。

program Project1;

uses
  MemCheck, Windows;

var
  S: string;
begin
  S := 'ほげほげ';
end.

‥‥だとメモリリークします。ほげほげという文字列が。


program Project1;

uses
  MemCheck, Windows;

procedure hoge;
var
  S: string;
begin
  S := 'ほげほげ';
end;

begin
  hoge;
end.

‥‥だとメモリリークしません。まプログラムコード部には
あんまりいろいろ書かないようにしなさいってことですかね?

ユニットファイル内のグローバルのvarは、リークしないです。
あくまでもプログラムファイル内のグローバルのvarだけです。

ちなみに最初のリークしちゃうケースでも、空文字列を最終的に
セットしていればリークしないです。

けっこう気づかず、はまってしまったので皆さんもお気をつけください。

編集    削除
田ーんぼラすかる  2004-12-15 09:05:32  No: 12315  IP: [192.*.*.*]

https://www.petitmonte.com/bbs/answers?question_id=800

編集    削除
kkk  2004-12-15 22:52:56  No: 12316  IP: [192.*.*.*]

これはメモリリークとは違いますね。
MemCheckの後処理ルーチンの呼ばれるタイミングが違うためだと思います。
下のプログラムだとhogeから帰ってきたときには S:string はすでに開放されています。
上のプログラムの場合MemCheckの後処理ルーチンが呼ばれた段階ではまだ S は開放されていないということだと思います。
S の開放処理はこの後正常に行われていると思いますので問題ないと思います。

編集    削除
にしの  2004-12-16 00:04:21  No: 12317  IP: [192.*.*.*]

たとえば
procedure hoge;
begin
  S := '...';
end;

begin
  S := '...';
end;

というように、hogeを呼ばなくてもリークしなくなりますね。
kkkさんのいうようにタイミングかと思います。
追ってみると、MemCheckユニットが解放された後もFreeMemしていますし。
# 文字列Sかどうかまでは追っていません
少なくとも、DelphiのMemoryManagerは自分で確保したメモリを解放していました。少しくらい残っていても問題ないと思います。
APIで取得したメモリは確実に解放しないとOSによってはメモリ不足になりそうですけどね。

編集    削除
いやだから  2004-12-16 00:05:39  No: 12318  IP: [192.*.*.*]

> MemCheckが正しく動作しないケース

実際にリークしてないのはいいんだけど、「リークしてる」と報告されるよ、ってことでしょ

編集    削除
Mr.XRAY  URL  2004-12-16 03:09:46  No: 12319  IP: [192.*.*.*]

ちょっと面白そうというのはおかしいのですが.やってみました.

MemCheck Ver2.00
Delphi6,7では
1回メモリを解放し忘れています.が表示されます.

MemCheck Ver2.70
Delphi6,7共に表示は現れませんでした.

ところで,かとちんさん,こんにちは.
かとちんさんが,ここに現れるとは思いもよりませんでした.

編集    削除
Mr.XRAY  URL  2004-12-16 03:18:03  No: 12320  IP: [192.*.*.*]

OSはWindowsXP(SP2)です.

# SP2を導入してから,ファイルアクセスが何か遅くなった気がする...

編集    削除
マッコ  2004-12-16 07:03:51  No: 12321  IP: [192.*.*.*]

Mr.XRAYさんMemCheck Ver2.70て何処にあるんですか、MemCheck Ver2.00は
http://linux.yks.ne.jp/~hori/program.htmlであるみたいですけど?

編集    削除
Mr.XRAY  URL  2004-12-16 07:41:28  No: 12322  IP: [192.*.*.*]

>Mr.XRAYさんMemCheck Ver2.70て何処にあるんですか

直接お教えしてもいいのですが,是非ネットで(Google)で検索して
みて下さい.

MemCheck Delphi で検索すると,2番目にあります.
DelphiのAND条件を入れないと,VB関係のもリストされてしまいます.

編集    削除
Mr.XRAY  URL  2004-12-16 08:18:50  No: 12323  IP: [192.*.*.*]

今メールをよこした方,折角ここでレスしているので,ここで質問して
下さいね.
私のリンクのページのGoogle検索は[日本語ページを検索]になって
いますので,一度表示してから[ウェブ全体から検索]にチェックして
再度検索して下さいね.

編集    削除
マッコ  2004-12-16 17:13:40  No: 12324  IP: [192.*.*.*]

Mr.XRAYさんありがとうございました、http://v.mahon.free.fr/pro/freeware/memcheck/
ここのところですね。

編集    削除