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

解決


はる  2005-11-08 02:20:15  No: 18507

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

追加です。
Delphi5です。

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


シャチ  2005-11-08 03:13:38  No: 18509

Result := StringList.GetText;

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


yaoki  2005-11-08 20:35:35  No: 18510

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


おっ  2005-11-08 22:21:36  No: 18511

シャチ さんの回答で正解

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

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


はる  2005-11-10 03:58:48  No: 18512

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加