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

解決


はる  2005-11-07 17: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-07 18:01:24  No: 18508  IP: 192.*.*.*

追加です。
Delphi5です。

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

編集 削除
シャチ  2005-11-07 18:13:38  No: 18509  IP: 192.*.*.*

Result := StringList.GetText;

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

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

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

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

シャチ さんの回答で正解

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

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

編集 削除
はる  2005-11-09 18:58:48  No: 18512  IP: 192.*.*.*

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

編集 削除