4

私が宣言した場合

PSomeStruct = ^TSomeStruct;
TSomeStruct = record 
  s1 : string;
end;

そして私は次のコードを実行します:

var
  p: PSomeStruct;
begin
  new(p);
  p^.s1:= 'something bla bla bla';
  dispose(p);

FastMM 4メモリマネージャは、メモリリークが発生したことを報告します(タイプ:文字列、データダンプ: "something bla bla bla")。ただし、呼び出す前にs1文字列を空に設定しても問題ありませんdispose

私が見つけた2番目の方法は、レコードタイプからクラスに変更するnewことです。次に、インスタンスを作成する代わりに、disposeを呼び出す代わりにinstance.Free()。弦を手動で掃除しなくても機能します。

電話をかけたときにDelphiで文字列を自動的にクリーンアップする方法はありますdisposeか?

4

2 に答える 2

1

あなたはすでに正しいことをしています。FastMMが文字列がリークしたと言った場合、FastMMは間違っているか、またはあなたが思っているものとは異なる文字列を報告しています。このDisposeプロシージャは、レコードから文字列を解放します。

この特定のケースでは、とにかくその文字列に割り当てられたメモリはないはずです。これは文字列リテラルなので、コンパイラがそのリテラルを割り当てることを期待します。その参照カウントはである必要が-1あり、FastMMはそれを見るべきではありませんでした。

于 2009-07-29T20:10:46.953 に答える
1

FastMMは.dprで使用される最初のユニットですか?そうしないと、ファイナライズが早すぎて、誤ったメモリリークが報告される可能性があります。

また、この簡略化されたコードサンプルは、JvSimpleXMLを使用する場合と同じメモリリークを生成しますか?そうでない場合は、おそらくもっと多くのことが起こっていると思います。

私の意見では、FastMMがメモリリークを報告すると、メモリリークが発生します。

于 2009-07-30T06:51:11.623 に答える