AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi werden pointer automatisch aus dem Speicher gelöscht?
Thema durchsuchen
Ansicht
Themen-Optionen

werden pointer automatisch aus dem Speicher gelöscht?

Ein Thema von alleinherrscher · begonnen am 8. Aug 2006 · letzter Beitrag vom 8. Aug 2006
Antwort Antwort
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#1

werden pointer automatisch aus dem Speicher gelöscht?

  Alt 8. Aug 2006, 12:15
Hi@all!

Ich hab hier sone Verkettung von Pointern:

Delphi-Quellcode:
 aComputer = ^TElement;
   TElement = record
    aName:String;
    aIP:String;
    aDescription:String;
    aPicture:Tbitmap;
    NextComputer:aComputer;
   end;
Die sind eben immer mit aComputer.NextComputer.NextComputer.... usw. verknüpft.
Wenn ich jetzt einen Pointer lösche, setzte ich jetzt den Vorgänger des zu löschenden Pointers auf den Nachfolger des zu löschenden Pointers.

Danach versuche ich mit freeandnil(zulöschenderPointer) noch ein bisschen aufzuräumen,
aber bekomme immer Speicherverletzungen!!!

Meine Frage: kann es sein, dass Delphi irgendwie den Pointer selbstständig löscht?
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: werden pointer automatisch aus dem Speicher gelöscht?

  Alt 8. Aug 2006, 12:17
Zitat von alleinherrscher:
Meine Frage: kann es sein, dass Delphi irgendwie den Pointer selbstständig löscht?
Nein, Dein Fehler muss an anderer Stelle liegen.

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#3

Re: werden pointer automatisch aus dem Speicher gelöscht?

  Alt 8. Aug 2006, 12:24
Zitat von sakura:
Zitat von alleinherrscher:
Meine Frage: kann es sein, dass Delphi irgendwie den Pointer selbstständig löscht?
Nein, Dein Fehler muss an anderer Stelle liegen.

......
Okay, danke für die schnelle Antwort!!!
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: werden pointer automatisch aus dem Speicher gelöscht?

  Alt 8. Aug 2006, 12:30
Zitat von alleinherrscher:
Die sind eben immer mit aComputer.NextComputer.NextComputer.... usw. verknüpft.
Wenn ich jetzt einen Pointer lösche, setzte ich jetzt den Vorgänger des zu löschenden Pointers auf den Nachfolger des zu löschenden Pointers.

Danach versuche ich mit freeandnil(zulöschenderPointer) noch ein bisschen aufzuräumen,
aber bekomme immer Speicherverletzungen!!!
ist doch klar.
Du hast das zu löschende Element schon aus der Liste rausgenommen.
Also kommst Du nicht mehr an dieses Element dran. Wie willst Du es löschen?

Lösung:
Du gehst die Liste solange durch, bis du das Element vor dem zu löschenden Element gefunden hast.
Jetzt merkst Du Dir den Nachfolger des zu löschenden Elements in einer temporären Variablen.
Nun kannst du mit Free (Element.NextComputer) oder Delete (Element.NextComputer) das zu löschende Element löschen und dann die Liste neu verknüpfen (mit Hilde der temp.Variablen).
Ob Du Free oder Delete oder was anderes benötigst, hängt davon ab, wie Du die Elemente erzeugst.
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#5

Re: werden pointer automatisch aus dem Speicher gelöscht?

  Alt 8. Aug 2006, 12:36
Zitat von RavenIV:
Zitat von alleinherrscher:
Die sind eben immer mit aComputer.NextComputer.NextComputer.... usw. verknüpft.
Wenn ich jetzt einen Pointer lösche, setzte ich jetzt den Vorgänger des zu löschenden Pointers auf den Nachfolger des zu löschenden Pointers.

Danach versuche ich mit freeandnil(zulöschenderPointer) noch ein bisschen aufzuräumen,
aber bekomme immer Speicherverletzungen!!!
ist doch klar.
Du hast das zu löschende Element schon aus der Liste rausgenommen.
Also kommst Du nicht mehr an dieses Element dran. Wie willst Du es löschen?

Lösung:
Du gehst die Liste solange durch, bis du das Element vor dem zu löschenden Element gefunden hast.
Jetzt merkst Du Dir den Nachfolger des zu löschenden Elements in einer temporären Variablen.
Nun kannst du mit Free (Element.NextComputer) oder Delete (Element.NextComputer) das zu löschende Element löschen und dann die Liste neu verknüpfen (mit Hilde der temp.Variablen).
Ob Du Free oder Delete oder was anderes benötigst, hängt davon ab, wie Du die Elemente erzeugst.
Ne, ich hab das Element sozusagen noch in der Hand, pass auf:

folgende Procedure:

Delphi-Quellcode:

procedure TForm1.DeleteComputerFromList(Computer:aComputer);
var laufComputer:acomputer;
begin

 laufComputer:=FirstComputer; //die Wurzel, FirstComputer selbst enthält keine Informationen

 while (LaufComputer.nextcomputer<>Computer) and (LaufComputer.NextComputer<>NIL) do
 begin
   laufcomputer:=laufcomputer.NextComputer;
 end;

  LaufComputer.NextComputer:=Computer.NextComputer;

  freeandnil(Computer)

end;
Ich hab zwar den Pointer schon aus der Liste rausgenommen, aber die Variable Computer zeigt ja noch auf das Element, oder?
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.875 Beiträge
 
Delphi 12 Athens
 
#6

Re: werden pointer automatisch aus dem Speicher gelöscht?

  Alt 8. Aug 2006, 12:44
Du verwendest freeandnil zur Freigabe eines records.
Das geht nicht!

OnlineHilfe gibt folgendes wieder:

Zitat:
FreeAndNil Routine

Gibt eine Objektreferenz frei und ersetzt die Referenz mit nil (Delphi) oder mit NULL (C++).

Unit
SysUtils

Syntax


[Delphi] procedure FreeAndNil(var Obj: Type);


Beschreibung
Mit FreeAndNil stellen Sie sicher, dass eine Variable nach der Freigabe der Objektreferenz nil (Delphi) bzw. NULL (C++) ist. Im Parameter Obj wird eine Variable übergeben, die ein Objekt repräsentiert.
Warnung:
Obj muss eine Instanz einer von TObject abgeleiteten Klasse sein.
Gruß

onlinekater
Thomas Breitkreuz
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#7

Re: werden pointer automatisch aus dem Speicher gelöscht?

  Alt 8. Aug 2006, 12:45
Wie legst du denn den Speicher für dein Record an? Mit Create? Wohl nicht, also auch kein FreeAndNil()!!

Ich vermute ganz stark, dass du New() verwendest und ein Blick in die Hilfe hätte dir das Pendant Dispose() zum freigeben verraten. Und sakura hätte dir das bestimmt auch geschrieben, aber du fragtest halt nur, ob Delphi den Speicher selber frei gibt - und das tut Delphi nunmal nicht.

FreeAndNil() ist für Klassen und entspricht folgendem:
Delphi-Quellcode:
AObj.Free;
AObj := Nil;
... und das geht bei deinem Record auch nicht...

/EDIT: trotz Kastens, da keine Alternative zur Lösung geschrieben wurde...
  Mit Zitat antworten Zitat
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#8

Re: werden pointer automatisch aus dem Speicher gelöscht?

  Alt 8. Aug 2006, 12:46
Zitat von onlinekater:

Du verwendest freeandnil zur Freigabe eines records.
Das geht nicht!

Gruß

onlinekater
Oh, danke! Das wirds wohl sein...dumme Frage, aber: Wie kann ich denn so ein "pointer auf ein Record" bzw ein Record freigeben? oder muss ich das gar nicht, sprich einfach das freeandnil weglassen und darauf vertrauen, das Delphi den mist selber ausm Speicher löscht?

Edit: Ich lese gerade Muetze1 hats schon geschrieben, DANKESCHÖN!
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: werden pointer automatisch aus dem Speicher gelöscht?

  Alt 8. Aug 2006, 16:46
Hallo,

noch ein Hinweis zu "vertrauen, dass Delphi den Mist selber löscht".

Ab NT (nicht Win98) wird der komplette Speicher beim Beenden des Programms
freigegeben, auch wenn du das nicht selber machst.

Bie Win9x erzeugst du ne Speicherleiche bis zum Neustart des Rechners.

Ich benutze memcheck (google), um Speicherleichen zu finden.


Heiko
Heiko
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:23 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz