Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Probleme mit Data (Pointer) (https://www.delphipraxis.net/69915-probleme-mit-data-pointer.html)

Chatfix 24. Feb 2007 21:43

Re: Probleme mit Data (Pointer)
 
Und jetzt nochmal für dumme zum mitschreiben bitte :)

Wenn ich vor dem ListView-Clear die Items durchlaufe, was muss ich alles beachten?

Delphi-Quellcode:
if Assigned(ListItem.Data) then
  Dispose(PString(ListItem.Data));
Da nicht unbedingt alle Items einen Pointer erhalten.

Vielen Dank schonmal im Vorraus

DGL-luke 24. Feb 2007 22:18

Re: Probleme mit Data (Pointer)
 
Sollte so hinhauen, ja. Du musst übrigens nicht auf "PString" casten.

btw. was ist "PString"?

chaosben 25. Feb 2007 06:24

Re: Probleme mit Data (Pointer)
 
PString ist ein Pointer auf einen String. :)

Imho sollte man den Pointer so casten, damit Dispose weiß, wieviel es freigeben muss.

DGL-luke 25. Feb 2007 10:04

Re: Probleme mit Data (Pointer)
 
Hmm... das könnte schief gehen. machs lieber so:

Delphi-Quellcode:
type
  PString = ^TStringRec;
  TStringRec = record
    str: string;
  end;
Und dann musst du das noch finalisieren:

Delphi-Quellcode:
if Assigned(ListItem.Data) then
begin
  Finalize(ListItem.Data);
  Dispose(ListItem.Data);
end;
Das Finalisieren ist wichtig, damit Delphi auch den String selbst freigibt. Ein String ist nänmlich eigentlich eine Klasse, und ich hab jetzt nicht genügend Code von dir um zu sehen, ob da alles koscher abläuft.

Du musst übrigens nicht casten, denn wenn du den Speicherbereich per New() alloziiert hast, weiß der MemoryManager, wie viel er an dieser Speicheradresse alloziiert hat. Und Dispose weiß dann auch ohne cast, wie viel freigegeben werden muss.

EDIT: Mooooment mal... ist "PString" schon in Delphi-Systemunits deklariert? Dann sollte die Compilermagic da eh kräftig mitmischen... zeigt mir das doch mal :gruebel:

chaosben 25. Feb 2007 11:19

Re: Probleme mit Data (Pointer)
 
Zitat:

Zitat von DGL-luke
Hmm... das könnte schief gehen.

Eigentlich sollte das nicht schief gehen, denn der Vorteil von New() und Dispose() ist ja gerade der, das diese Routinen (im Gegensatz zu GetMem() und FreeMem()) mit langen Strings umgehen können.

Edit:
Zitat:

Zitat von Die Delphi-Hilfe ©Borland
Finalize sollte nur in Delphi-Quelltext verwendet werden, in dem eine dynamisch erstellte Variable nicht mit der Prozedur Dispose freigegeben wird.

Edit2:
Ok, du hast doch recht. .... nur woher hab ich das mit dem Dispose und den langen Strings ... und außerdem: In der Praxis funktionierts :gruebel:

Muetze1 25. Feb 2007 13:39

Re: Probleme mit Data (Pointer)
 
@DGL-luke: Ein paar Fragen zu deinem letzen Beitrag:

1. Warum ein Record mit nur einem String und nicht direkt Zeiger auf den String? Was soll der Unterschied sein?
2. Das Finalize sollte den Typ bekommen, also PString und nicht einfach nur einen Pointer. Daher bin ich mir nicht sicher, ob Finalize überhaupt in der Form des Aufruf was macht bzw. machen kann. Da ihm der Typ unbekannt ist und er einen untypisierten Zeiger bekommt, kann er nichts ausrichten.
3. Wie du selber schreibst, ist Finalize bei Dispose unnötig. Wenn man nun also das Finalize entfernt, dann sollte Dispose auch den richtigen Zeigertyp bekommen, damit er denn finalisieren kann, sonst fehlt auch ihm das Wissen über den Typ der Struktur. Dieses wird vom Speichermanager nicht abgelegt

DGL-luke 25. Feb 2007 13:47

Re: Probleme mit Data (Pointer)
 
Bevor ich hier noch irgendwas sage, will ich ein Codeschnipsel mit der Deklaration von PString sehen. Hugh.

Christian Seehase 25. Feb 2007 13:57

Re: Probleme mit Data (Pointer)
 
Moin Lukas,

Zitat:

Zitat von DGL-luke
Bevor ich hier noch irgendwas sage, will ich ein Codeschnipsel mit der Deklaration von PString sehen.

Da Du eine Pro-Version hast:
PString in der IDE eingeben, und mit gedrückter STRG-Taste anklicken...

DGL-luke 25. Feb 2007 14:04

Re: Probleme mit Data (Pointer)
 
Ach so ist das also. Na dann is ja klar, dass man sich da nicht drum kümmern braucht(wie ich bereits schrieb). ein einfaches Dispose(PVar) sollte dann reichen, tuts ja auch.

Muetze1 25. Feb 2007 14:56

Re: Probleme mit Data (Pointer)
 
und um nochmal auf meine Ausführungen zurück zu kommen: ein Dispose(PVar), wenn PVar vom richtigen Typ ist. Ein Dispose auf einen untypisierten Pointer bringt nix in Sachen Finalize.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:08 Uhr.
Seite 2 von 4     12 34      

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