Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

Re: Free, FreeAndNil und mehrere Variablen

  Alt 17. Mai 2010, 16:22
Selbst wenn der Speicher gelöscht würde, dann würde B immernoch auf diese Stelle zeigen.
Was der Speichermanager nun genau macht, das kann man natürlich nicht bestimmen.

Aber es ist ja egal, ob nun der Speicher wirklich freigegeben würde,
kann man sowas nicht machen.

Ob nun etwas Altes angezeigt wird, oder es eine Zugriffsverletzung gibt, wenn man drauf zugreifen ... es kann immernoch passieren, daß inzwischen ein anderes Objekt erzeugt wurde, welches zufälig an der Stelle liegt ....

Man sollte sich einfach im Klaren sein, daß der Objektzeiger eben nur ein Zeiger auf ein Objekt ist
und daß man beim Kopieren dieses Zeigers eben aufpassen muß.

anderes Beispiel:
Delphi-Quellcode:
var
  a, b: THaus;

begin
  // THaus.Create baut ein Haus
  // a ist ein Zettel, auf welchen die Adressse draufgeschrieben wird
  a := THaus.Create;
  // b ist eine Kopie dises Zettels
  b := a;

  Memo1.Lines.Add(a.AdresseAblesen);
  Memo1.Lines.Add(b.AdresseAblesen);

  // das Haus wird zerstört
  a.Free;
  // der Zettel wird vernichtet (alles wird mit Weiß übermalt)
  a := nil;

  // geht nicht, da der Text ja gelöscht wurde
  Memo1.Lines.Add(a.AdresseAblesen);
  // tja, hier steht dennoch die Adresse drauf,
  // selbst wenn das Haus vernichtet und der andere Zettel überschrieben wurde
  Memo1.Lines.Add(b.AdresseAblesen);
end;
bezüglich dem ausgelesenen Wert von B
- der Speichermanager vernichtet nicht alles sofort, wenn man es ihm sagt ... vielleicht benötigt man den Baugrund ja demnächst gleich wieder ... drum kann man eventuell noch was auslesen
- wenn es doch schon gelöscht wurde, dann knallt es natürlich, weil du beim betreten des "Hauses" in ein tiefes Loch fällst
- inzwischen könnte ja auch schon ein neues Haus gebaut wurden sein, dann zeigt die Adresse natürlich immernoch auf etwas ... blos halt was Anderes
$2B or not $2B
  Mit Zitat antworten Zitat