Delphi-PRAXiS
Seite 3 von 5     123 45      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Objekte / Freigaben / Free / Nil (https://www.delphipraxis.net/176997-objekte-freigaben-free-nil.html)

Namenloser 9. Okt 2013 15:59

AW: Objekte / Freigaben / Free / Nil
 
Free bzw. Destroy gibt nur den Speicherbereich wieder frei – das sagt nur dem Speichermanager, dass er den Speicherplatz neu vergeben darf. Der Speicher wird aber nicht überschrieben – wozu auch, normalerweise sollte da ja niemand mehr drauf zugreifen.

Es kann also schon sein, dass nach einer Freigabe die Daten des Objektes noch an der Stelle im Speicher stehen, obwohl das Objekt nicht mehr existiert. Darauf kann man sich aber nicht verlassen.

Blup 9. Okt 2013 16:34

AW: Objekte / Freigaben / Free / Nil
 
Zitat:

Zitat von baumina (Beitrag 1231436)
EDIT : Aber solltest du im Destroy nicht einen TypeCast auf TMyOwnObject machen? FreeAndNil(TMyOwnObject(Objects[i]))

Das ist für den Aufruf des richtigen Destruktors nicht notwendig. Destroy ist schon in der Basisklasse TObject virtuell deklariert.
Jede Klasse muss Destroy, wenn erforderlich, in geeigneter Weise überschrieben, um die Instanz vollständig freizugeben.

Alex_ITA01 9. Okt 2013 20:10

AW: Objekte / Freigaben / Free / Nil
 
@Uwe: Ich habe ja nur den Quelltext an den beiden besagten Stellen angepasst. Siehe also mein Beispiel im ersten Post, dort steht ja im FormDestroy "MyObjList.Free;".
Trotzdem kann ich nach der besagten Änderung (OwnObjects=True) immernoch im FormDestroy nach dem "MyObjList.Free;" folgendes abfragen/aufrufen:

Delphi-Quellcode:
if Assigned(tmpObject) then
  begin
    if tmpObject.CheckA then
      Sleep(0);
    if Assigned(tmpObject.ObjInternList) then
      Sleep(0);
  end;
Das ist ja nur eine Minianwendung wo es recht übersichtlich ist. Wie kann man denn ganz sicher die Objekte freigeben und falls jemand anderes (vielleicht ein parallel laufender Thread) diese auf Gültigkeit abfragt auch wirklich feststellen, dass man noch drauf zu greifen kann?!

Gruß

jaenicke 9. Okt 2013 20:30

AW: Objekte / Freigaben / Free / Nil
 
Nebenbei hat eine TStringList bei aktuellen Delphiversionen die Eigenschaft OwnsObjects.

Namenloser 9. Okt 2013 20:43

AW: Objekte / Freigaben / Free / Nil
 
Zitat:

Zitat von Alex_ITA01 (Beitrag 1231481)
Das ist ja nur eine Minianwendung wo es recht übersichtlich ist. Wie kann man denn ganz sicher die Objekte freigeben und falls jemand anderes (vielleicht ein parallel laufender Thread) diese auf Gültigkeit abfragt auch wirklich feststellen, dass man noch drauf zu greifen kann?!

Geht nicht. Musst du anders lösen, z.B. über ein Observer-Pattern.

Und Multi-Thread ist noch mal eine Sache für sich...

Alex_ITA01 9. Okt 2013 21:20

AW: Objekte / Freigaben / Free / Nil
 
@jaenicke: Das war ja auch der Vorschlag von Uwe Raabe aber das Endergebnis ist ja das gleiche. Ich kann nicht erkennen, ob das Objekt noch da ist oder nicht.

Sowohl in meinem Beispiel in Post 1 als auch die Variante mit OwnsObjects wird mir mit ReportOnMemoryLeaks auch kein Speicherleck abgezeigt.
Ist ja schön wenn das auch so ist aber ich verstehe nur nicht, warum ich auf alle Eigenschaften und Variablen des Objekts zugreifen kann obwohl es eigentlich freigegeben wurde.
Gibt es keine Variante, dass Objekt so freizugeben, dass eine
Delphi-Quellcode:
if Assigned
Abfrage dann auch wirklich "False" liefert?

Gruß

Uwe Raabe 9. Okt 2013 21:41

AW: Objekte / Freigaben / Free / Nil
 
Zitat:

Zitat von Alex_ITA01 (Beitrag 1231486)
Gibt es keine Variante, dass Objekt so freizugeben, dass eine
Delphi-Quellcode:
if Assigned
Abfrage dann auch wirklich "False" liefert?

Solange du die besagte Variable nicht selbst auf nil setzt, nein. Dein Problem ist, daß mehrere Variablen auf dasselbe Objekt verweisen. Wird dieses Objekt freigegeben, zeigen alle diese Variablen auf einen ungültigen Speicherbereich. Das kannst du ohne erheblichen Aufwand nicht vermeiden. Schon gar nicht im Multithread-Bereich.

stahli 9. Okt 2013 21:41

AW: Objekte / Freigaben / Free / Nil
 
Das Problem ist nicht so einfach zu lösen.

Hier mal ein paar ältere Diskussionen dazu:
http://www.delphipraxis.net/166899-i...eferenzen.html
http://www.delphipraxis.net/159095-r...e-objekte.html

Alex_ITA01 9. Okt 2013 21:43

AW: Objekte / Freigaben / Free / Nil
 
Ok danke für die Info. Wo wäre denn die richtige Stelle zum Nil setzen, wenn ich es selber machen muss @Uwe?

Gruß

Uwe Raabe 9. Okt 2013 23:26

AW: Objekte / Freigaben / Free / Nil
 
Zitat:

Zitat von Alex_ITA01 (Beitrag 1231492)
Ok danke für die Info. Wo wäre denn die richtige Stelle zum Nil setzen, wenn ich es selber machen muss @Uwe?

Nach deinem gezeigten Code zu urteilen, wäre folgende Code-Sequenz im FormDestroy korrekt:

Delphi-Quellcode:
procedure TForm4.FormDestroy(Sender: TObject);
begin
  tmpObject := nil;
  MyObjList.Free;
  MyObjList := nil;
end;

Die beiden if-Anweisungen würden demnach immer fehlschlagen und der dahinter liegende Code kann somit eliminiert werden. Solange die beiden Variablen nicht noch anderswo verwendet werden, braucht man sie dann aber auch nicht auf nil setzen. Damit reduziert sich das FormDestroy auf ein simples
Delphi-Quellcode:
MyObjList.Free;


Ich vermute aber, daß dein eigentlicher Code etwas ganz anderes macht. Dazu kann ich so natürlich nichts sagen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:26 Uhr.
Seite 3 von 5     123 45      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz