Einzelnen Beitrag anzeigen

HeZa

Registriert seit: 4. Nov 2004
Ort: Dortmund
182 Beiträge
 
Delphi 10 Seattle Professional
 
#6

AW: LiveTime Managment an Object übergeben

  Alt 1. Dez 2015, 22:44
Hallo Mavarik,

Delphi-Quellcode:
Var
  S : TStream;
  F : TStreamWrapper;
begin
  S := TStream.Create;
  F := TStreamWrapper(S);
  ...
  S.Free; // Ruft F.Free auf und dann wird S.Free aufgerufen
end;
wieso sollte hier zweimal Free aufgerufen werden, es ist doch nur ein Objekt erzeugt worden. F und S zeigen doch auf das selbe Objekt, da TStreamWrapper(S) ja nur ein CAST ist.

Mir ist deine Motivation für diese Anforderung nicht klar.

Meine Wrapper-Klassen sehen eher so aus:
Delphi-Quellcode:
type
  TStreamWrapper = class(TStream)
  private
    FStream: TStream;
    FOwnsStream: Boolean;
    ...
  public
    constructor Create(Stream: TStream; OwnsStream: Boolean);
    destructor Destroy; override;
    ...
  end;

  constructor TStreamWrapper.Create(Stream: TStream; OwnsStream: Boolean);
  begin
    inherited Create;
    FStream := Stream;
    FOwnsStream := OwnsStream;
  end;

  destructor TStreamWrapper.Destroy;
  begin
    if FOwnsStream then
      FStream.Free;
    inherited;
  end;

var
  S : TStream;
  F : TStreamWrapper;
begin
  S := TStream.Create;
  F := TStreamWrapper.Create(S, True);
  ...
  F.Free; // Ruft S.Free auf und dann wird F freigegeben
end;
Und dann ist auch klar wie die Freigabe erfolgt.

Deine Anforderung scheint noch ein Geheimis zu enthalten das du nicht mit uns teilen willst.

Geändert von HeZa ( 1. Dez 2015 um 22:50 Uhr) Grund: kleinere Korrektur
  Mit Zitat antworten Zitat