AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dispose: Pointer oder Object?

Ein Thema von PeterPanino · begonnen am 3. Feb 2009 · letzter Beitrag vom 4. Feb 2009
Antwort Antwort
Seite 1 von 2  1 2      
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#1

Dispose: Pointer oder Object?

  Alt 3. Feb 2009, 04:20
Hallo, ich habe eine Frage zu Dispose:

Ich hänge an die Nodes einer TreeView Record-Objekte an:

Delphi-Quellcode:
type
  PNoteRec = ^TNoteRec;
  TNoteRec = record
    Caption: string;
    ID: string;
  end;

implementation

procedure TformMain.BaumElementHinzufuegen(const TV: TTreeView);
var
  NewNode: TTreeNode;
  NoteRecPtr: PNoteRec;
begin
  New(NoteRecPtr);
  NoteRecPtr^.Caption := 'XYZ';
  NoteRecPtr^.ID := 'ZYX';
  NewNode := TV.Items.AddChildObject(TV.Items[0], 'XYZ', NoteRecPtr);
  // ...
Nun möchte ich den reservierten Speicher bei Programmende freigeben:

Dispose(TV.Items[j].Data); oder:

Dispose(PNoteRec(TV.Items[j].Data)); Welche der beiden Dispose-Varianten muss ich verwenden?
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Dispose: Pointer oder Object?

  Alt 3. Feb 2009, 04:32
In dem Fall kannst Du die Typinformation weglassen. Das Speichermanagement funktioniert.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3

Re: Dispose: Pointer oder Object?

  Alt 3. Feb 2009, 12:24
Zitat von Union:
In dem Fall kannst Du die Typinformation weglassen. Das Speichermanagement funktioniert.
Von wegen. Wenn er den Typecast weg lässt, dann wird das "Dispose" vom Compiler in ein "FreeMem" umgeschrieben und die beiden Strings (Managed-Datentypen) bleiben im Speicher liegen, da nur die beiden Zeiger auf die Strings mit dem FreeMem freigegeben werden, nicht aber die Strings selbst.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Dispose: Pointer oder Object?

  Alt 3. Feb 2009, 12:30
Zitat von PeterPanino:
Nun möchte ich den reservierten Speicher bei Programmende freigeben:
Hat die TreeView nicht ein Ereignis für NodeWirdFreigegeben?
Also ich würde das Freigeben dann dort drin machen.


Und jbg hat Recht.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Dispose: Pointer oder Object?

  Alt 3. Feb 2009, 12:31
Und wieso findet dann Memcheck das so erzeugte vermeintliche Speicherleck nicht? Ich habe das ganz ohne Dispose getestet und natürlcih gab es ein Leck. Beide Varianten mit Dispose (mit / ohne Typecast) brachten kein Leck.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Dispose: Pointer oder Object?

  Alt 3. Feb 2009, 12:32
Hmmm, eigentlich müßte ein Leck entstehen ... wie hast'n das getestet?
Etwas Code wäre nett, nicht daß du über einen der Sonderfälle bei den Strings gestolpert bist
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Dispose: Pointer oder Object?

  Alt 3. Feb 2009, 12:40
Mit Eurekalog und eingeschaltetem Memcheck. Allerdings habe ich nur ein NoteRec erzeugt mit den ersten 3 Zeilen der Prozedur:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  NoteRecPtr: PNoteRec;
begin
  New(NoteRecPtr);
  NoteRecPtr^.Caption := 'XYZ';
  NoteRecPtr^.ID := 'ZYX';
  Dispose(NoteRecPtr);
end;
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Dispose: Pointer oder Object?

  Alt 3. Feb 2009, 12:46
'XYZ' ist eine untypisierte Konstante und bei Strings liegen untypisierte Konstanten nicht im RAM.

versuch's mal statt mit 'ner Konstante über eine dieser 3 Varianten
Delphi-Quellcode:
NoteRecPtr^.Caption := IntToStr(123);

SetLength(NoteRecPtr^.Caption, 3);

NoteRecPtr^.ID := 'XYz';
NoteRecPtr^.ID[3] := 'Z';
$2B or not $2B
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: Dispose: Pointer oder Object?

  Alt 3. Feb 2009, 14:12
Komisch, wenn ich NACH dem Dispose die Record-Daten abfrage, bekomme ich bei beiden Dispose-Arten ein jeweils anderes Ergebnis:

Hier werden im zweiten MessageDlg die Record-Daten weiterhin angezeigt:

Delphi-Quellcode:
MessageDlg(PNoteRec(TL.Items[j].Data)^.Caption, mtInformation, [mbOK], 0);
Dispose(TL.Items[j].Data);
MessageDlg(PNoteRec(TL.Items[j].Data)^.Caption, mtInformation, [mbOK], 0);
Und hier wird im zweiten MessageDlg gähnende Leere angezeigt:

Delphi-Quellcode:
MessageDlg(PNoteRec(TL.Items[j].Data)^.Caption, mtInformation, [mbOK], 0);
Dispose(PNoteRec(TL.Items[j].Data));
MessageDlg(PNoteRec(TL.Items[j].Data)^.Caption, mtInformation, [mbOK], 0);
Bei beiden Dispose-Arten entsteht jedoch durch den Zugriffsversuch auf die Record-Daten NACH dem Dispose kein (Zeiger-)Fehler, obwohl mit Dispose der Speicher bzw. der Zeiger auf den Speicher ja freigegeben worden sein müsste!?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Dispose: Pointer oder Object?

  Alt 3. Feb 2009, 14:27
nach dem Freigeben von Speicher sollte man eh nicht mehr versuchen darauf zuzugreifen.

Nur weil mit Dispose (oder sonstwas) spehcer freigegeben wurde, kann ers sein, daß dieser dennoch vom Speichermanager reserviert ist (schlimmstenfalls wird dieser Speicher sogar inzwischen für was Anderes verwendet)

bei Dispose werden die Strings freigegeben, wobei der interne Stringzeiger nun auf NIL steht ... drum zeigt das Zweite nichts mehr an, wärend (wie schon gesagt) Dispose ohne Typeninformationen die Strings nicht freigibt und auch nicht den Record nullt ... drum kannst du beim Ersten noch alles auslesen (das erwähnte Speicherleck)

PS: wenn der Speichermanager den ganzen Speicherbereich freigegeben hätte, dann hättest du bei beiden Varianten eine Zugriffsverletzung geerntet.
(der Speichermanager reserviert große Speicherbereiche und gibt diesen in kleineren Portionen weiter ... ist optimaler so)
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 03:33 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