知っていましたでしょうか。
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だけです。
ちなみに最初のリークしちゃうケースでも、空文字列を最終的に
セットしていればリークしないです。
けっこう気づかず、はまってしまったので皆さんもお気をつけください。
https://www.petitmonte.com/bbs/answers?question_id=800
これはメモリリークとは違いますね。
MemCheckの後処理ルーチンの呼ばれるタイミングが違うためだと思います。
下のプログラムだとhogeから帰ってきたときには S:string はすでに開放されています。
上のプログラムの場合MemCheckの後処理ルーチンが呼ばれた段階ではまだ S は開放されていないということだと思います。
S の開放処理はこの後正常に行われていると思いますので問題ないと思います。
たとえば
procedure hoge;
begin
S := '...';
end;
begin
S := '...';
end;
というように、hogeを呼ばなくてもリークしなくなりますね。
kkkさんのいうようにタイミングかと思います。
追ってみると、MemCheckユニットが解放された後もFreeMemしていますし。
# 文字列Sかどうかまでは追っていません
少なくとも、DelphiのMemoryManagerは自分で確保したメモリを解放していました。少しくらい残っていても問題ないと思います。
APIで取得したメモリは確実に解放しないとOSによってはメモリ不足になりそうですけどね。
> MemCheckが正しく動作しないケース
実際にリークしてないのはいいんだけど、「リークしてる」と報告されるよ、ってことでしょ
ちょっと面白そうというのはおかしいのですが.やってみました.
MemCheck Ver2.00
Delphi6,7では
1回メモリを解放し忘れています.が表示されます.
MemCheck Ver2.70
Delphi6,7共に表示は現れませんでした.
ところで,かとちんさん,こんにちは.
かとちんさんが,ここに現れるとは思いもよりませんでした.
OSはWindowsXP(SP2)です.
# SP2を導入してから,ファイルアクセスが何か遅くなった気がする...
Mr.XRAYさんMemCheck Ver2.70て何処にあるんですか、MemCheck Ver2.00は
http://linux.yks.ne.jp/~hori/program.htmlであるみたいですけど?
>Mr.XRAYさんMemCheck Ver2.70て何処にあるんですか
直接お教えしてもいいのですが,是非ネットで(Google)で検索して
みて下さい.
MemCheck Delphi で検索すると,2番目にあります.
DelphiのAND条件を入れないと,VB関係のもリストされてしまいます.
今メールをよこした方,折角ここでレスしているので,ここで質問して
下さいね.
私のリンクのページのGoogle検索は[日本語ページを検索]になって
いますので,一度表示してから[ウェブ全体から検索]にチェックして
再度検索して下さいね.
Mr.XRAYさんありがとうございました、http://v.mahon.free.fr/pro/freeware/memcheck/
ここのところですね。
ツイート | ![]() |