Dieser Thread ist ein Spin-Off von
Delphi Kurzreferenz
Dort hat
Deep Sea folgenden Code gepostet:
Delphi-Quellcode:
constructor TAbgeleiteteKlasse.Create;
begin
FStream := TMemoryStream.Create;
inherited Create(FStream);
end;
destructor TAbgeleiteteKlasse.Destroy;
begin
inherited; // Könnte ja auf den übergebenen Stream noch zugreifen.
FStream.Free;
end;
Auf den ersten Bick sieht der Code korrekt aus, aber er trägt eine Zeitbombe in sich.
Nach dem Aufruf von inherited im Destruktor in der gesamte Speicher des Objekts freigegeben.
Es ist daher verboten nach diesem Zeitpunkt auf
FStream zuzugreifen.
Das MemoryStream-Objekt selbst ist zwar noch intakt, aber die Variable FStream ist nicht mehr gültig.
In den allermeisten Fällen geht ein Zugriff auf diesen freigegebenen Speicher glimpflich ab.
Wenn man allerdings einen Memory-Manager (FasttMM4) benützt und dieser den freigegebenen Speicher
mit bestimmten Gardbytes füllt, dann wird das Problem offensichtlich.
Oder wenn ein anderer Thread zufällig gerade den Speicher bekommt der soeben im Destruktor freigegeben wurde dann gibt das ganz bösartige Probleme.
Ich behaupte also man darf so wie oben nicht programmieren und lade jeden ein sich zu überlegen, wie man das Problem umgehen könnte.