MemCheck 2.0 を組み込んで実行したら
「1回メモリーを解放し忘れています」と
言われました。
不明なファイル : @Sysutils@StrAlloc 関数
dbacc.pas(290) : GetSql 関数
該当箇所は下記のようになっています。
function GetSql(filename: String): String;
var
StringList: TStringList;
begin
StringList := TStringList.Create;
try
StringList.LoadFromFile(filename);
Result := StringList.GetText;
finally
StringList.Free;
end;
end;
もしかしたら単純なボケかもしれませんが、
何が悪いのか、どうしたらよいのか
教えていただけませんでしょうか?
追加です。
Delphi5です。
MemCheck 2.73 でも、同じく StrAlloc で
メモリリークだと言われました。
LoadFromFile()に問題がありそうな
気がしてしまうのですが…
Result := StringList.GetText;
を
Result := StringList.Text;
にしてみるとどうですか?
この関数を呼んだほうでFreeしてください。
シャチ さんの回答で正解
TStrings.GetText の戻り値は、PChar型です。
これは、新たにメモリを確保して、そのポインタを返す仕様です。
以上より、GetTextで確保されたメモリが開放されないため、メモリリークします。
みなさんどうもありがとうございます。
深く調べもせずに盲目的に GetText を使っていました。
Text を使うのが正しいということがわかり目から鱗が落ちました。
どうも、ありがとうございました。ぺこり
ツイート | ![]() |