![]() |
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:
Da nicht unbedingt alle Items einen Pointer erhalten.
if Assigned(ListItem.Data) then
Dispose(PString(ListItem.Data)); Vielen Dank schonmal im Vorraus |
Re: Probleme mit Data (Pointer)
Sollte so hinhauen, ja. Du musst übrigens nicht auf "PString" casten.
btw. was ist "PString"? |
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. |
Re: Probleme mit Data (Pointer)
Hmm... das könnte schief gehen. machs lieber so:
Delphi-Quellcode:
Und dann musst du das noch finalisieren:
type
PString = ^TStringRec; TStringRec = record str: string; end;
Delphi-Quellcode:
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.
if Assigned(ListItem.Data) then
begin Finalize(ListItem.Data); Dispose(ListItem.Data); end; 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: |
Re: Probleme mit Data (Pointer)
Zitat:
Edit: Zitat:
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: |
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 |
Re: Probleme mit Data (Pointer)
Bevor ich hier noch irgendwas sage, will ich ein Codeschnipsel mit der Deklaration von PString sehen. Hugh.
|
Re: Probleme mit Data (Pointer)
Moin Lukas,
Zitat:
PString in der IDE eingeben, und mit gedrückter STRG-Taste anklicken... |
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.
|
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 14:54 Uhr. |
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