TStringListがMemCheckでメモリリークと言われる?

解決


はる  2005-11-08 02:20:15  No: 18507  IP: [192.*.*.*]

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;

もしかしたら単純なボケかもしれませんが、
何が悪いのか、どうしたらよいのか
教えていただけませんでしょうか?

編集    削除
はる  2005-11-08 03:01:24  No: 18508  IP: [192.*.*.*]

追加です。
Delphi5です。

MemCheck 2.73 でも、同じく StrAlloc で
メモリリークだと言われました。
LoadFromFile()に問題がありそうな
気がしてしまうのですが…

編集    削除
シャチ  2005-11-08 03:13:38  No: 18509  IP: [192.*.*.*]

Result := StringList.GetText;

Result := StringList.Text;
にしてみるとどうですか?

編集    削除
yaoki  2005-11-08 20:35:35  No: 18510  IP: [192.*.*.*]

この関数を呼んだほうでFreeしてください。

編集    削除
おっ  2005-11-08 22:21:36  No: 18511  IP: [192.*.*.*]

シャチ さんの回答で正解

TStrings.GetText の戻り値は、PChar型です。
これは、新たにメモリを確保して、そのポインタを返す仕様です。

以上より、GetTextで確保されたメモリが開放されないため、メモリリークします。

編集    削除
はる  2005-11-10 03:58:48  No: 18512  IP: [192.*.*.*]

みなさんどうもありがとうございます。
深く調べもせずに盲目的に GetText を使っていました。
Text を使うのが正しいということがわかり目から鱗が落ちました。
どうも、ありがとうございました。ぺこり

編集    削除