7

AnsiString から TBytes (文字列の配列) へのハード型キャストを ToBytes メソッド (以下を参照) に置き換えた後、Delphi はメモリ リークを報告しませんでした - ただし、Free Pascal 2.6.2 では、TBytes 値がタイプのパラメータPointer

次のコードでは、メモリ リークが発生します。

program project1;

{$mode delphi}

uses
  SysUtils;

function ToBytes(const AValue: AnsiString): TBytes;
begin
  SetLength(Result, Length(AValue)); // <-- leak (ine 10)
  if Length(AValue) > 0 then
    Move(AValue[1], Result[0], Length(AValue));
end;

procedure Send(P: Pointer);
begin

end;

begin
  Send(ToBytes('test'));

  SetHeapTraceOutput('heaptrace.log');
end. 

メモリ リーク レポート:

Call trace for block $001C5CC0 size 12   $00401586  TOBYTES,  line 10
of project1.lpr   $00401622  main,  line 21 of project1.lpr

Send メソッドを TBytes 型の引数を取るように変更すると、メモリ リークはなくなります。

4

3 に答える 3

1

あなたが思っているのはおそらくバグではないでしょう。FPC のヒープ トレースには、メイン プログラム (メインの .dpr begin..end) での一時 (および一般的な自動化された型) の追跡に関する既知の問題があります。

コードをプロシージャに移動し、メインの begin..end から呼び出します。漏れが消えるのがわかります。

これは、メイン プログラムの一般的な構造が次のようになっているためです。

begin 
  initializeunits(); // procedure call inserted by the compiler
    <actual mainprogram statements>
  finalizeunits();   // procedure call inserted by the compiler
end.

メインプログラム一時のリリースは「終了」時に行われます。ヒープトラッキングをファイナライズする finalizeunits の後。(最初のユニットであっても、それは単なるユニットです)。したがって、 heaptrc はそれを見逃しています。

于 2014-03-05T13:38:07.233 に答える