0

onDestroy イベントで Tlist 内の Tlist を解放しようとしていますが、FastMM4 でアクセス違反エラーが発生しています。これがコードスニペットです。

procedure TSignalFrm.FormDestroy(Sender: TObject);
var
  x,y: integer;
begin
  for x := 0 to signalList.Count - 1 do
  begin
    for y:=0 to TSignal(SignalList.Items[x]).alarmList.Count-1 do
    begin
      TAlarm(TSignal(SignalList.Items[x]).alarmList.Items[y]).Free;
    end;
    TSignal(SignalList.Items[x]).AlarmList.Free;
    TSignal(SignalList.Items[x]).Free;
  end;
  SignalList.Free;
end;

TSignal(SignalList.items[x]).Free; でアクセス違反エラーが発生します。ライン。SignalList 項目を解放する前に AlarmList 項目を解放すると、アクセス違反エラーが発生しますが、なぜですか?

更新: Windows XP で Delphi 7.0 を使用しています。実際の FastMM4 メッセージは次のとおりです。


FastMM は、解放されたオブジェクトで仮想メソッドを呼び出す試みを検出しました。現在の操作を中止するために、アクセス違反が発生するようになりました。

解放されたオブジェクト クラス: TList

仮想メソッド: 破棄

仮想メソッド アドレス:427CF0

割り当て番号: 80055

大量のメモリ ダンプが続きます。


この FastMM4 エラーによると、別のオブジェクト内でオブジェクトを解放すると、所有者も自動的に解放されます。それが真実ではないことはわかっていますが、間違っている場合は修正してください。

4

2 に答える 2

5

デストラクタでメンバーをTSignal解放しませんか? AlarmList(それが私がこれを行う方法です)。

更新:行を削除しても機能しますTSignal(SignalList.Items[x]).AlarmList.Free;か?

2 番目の更新: オブジェクトへのポインターが含まれている場合は、それぞれTListアイテムを解放する必要があります。

あなたの問題は、それがでTSignalないことでしたTListメンバー(Alarmlist など)の解放を処理するため、その Alarmlist を明示的に解放しないでください。

于 2011-03-25T14:23:56.393 に答える
2

TAlam と TSignal は両方ともオブジェクト (レコードではない) であるため、TList の代わりに TObjectList を使用する必要があると思います。TObjectList には、OwnsObjects と呼ばれる特別なプロパティがあり、コンテンツを解放する際に適切にコンテンツを解放できます。これをチェックしてくださいhttp://docwiki.embarcadero.com/VCL/XE/en/Contnrs.TObjectList.OwnsObjects

アドバイスとして、オブジェクトではなくポインターを格納する必要がない限り、TList を使用しないでください。

于 2011-03-25T14:31:03.083 に答える