Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi String-Result explizit freigeben (https://www.delphipraxis.net/136364-string-result-explizit-freigeben.html)

AJ_Oldendorf 29. Jun 2009 10:49


String-Result explizit freigeben
 
Hallo zusammen,
Robert Marquardt, hat in dem letzten Post geschrieben, dass String-Result zwar initialisiert werden aber nicht freigegeben werden.
Ist dies wirklich so und muss jetzt nach jedem Funktionsaufruf mit String-Result explizit "das Result" freigegeben werden?

Viele Grüße
Alex

PChar als Result

mkinzler 29. Jun 2009 11:11

Re: String-Result explizit freigeben
 
PChar ist ja nur ein Zeiger auf einen String. Der Speicherbereich, der von ihm referenziert wird, wird natürlich nicht automatisch Freigeben

Popov 29. Jun 2009 11:13

Re: String-Result explizit freigeben
 
Also ich weiß nicht ob das stimmt, aber das würde ja richtig in Arbeit ausarten.

Also ich schieße ins Blaue und sage mal, daß es so wahrscheinlich nicht stimmt. Ich hab schon Programme gehabt in während einer Sitzung paar Gigabyte an String Results hin und her schoben. Mir ist dabei nicht aufgefallen, daß ich Speicherprobleme hatte. Und vor allem bei speicherintensiven Programmen habe ich den Taskmanager oft zur Kontrolle offen. Ich teste dabei ob der Speicher ansteigt und nicht wieder freigegeben wird. Mir ist noch nie aufgefallen, daß bei großen Strings der Speicher nicht wieder freigegeben wurde.

Edit:

Zitat:

Zitat von AJ_Oldendorf

Ich hab beim ersten Lesen übersehen, daß es um PChar geht (dachte es ist die Signatur). Also bei PChar könnte das stimmen. Ich bezog mich auf den brutalen String.

QuickAndDirty 29. Jun 2009 11:18

Re: String-Result explizit freigeben
 
Mein GOTT...
Lade lieber mal Robert zu diesem Thread ein. Ich denke du hast ihn gaaaanz falsch verstanden.

mkinzler 29. Jun 2009 11:19

Re: String-Result explizit freigeben
 
@QuickAndDirty: Das ist nicht witzig!

himitsu 29. Jun 2009 11:21

Re: String-Result explizit freigeben
 
Das dort angesprochene Problem war eher, daß der String zu früh freigegeben wird.

ein "String" (der Datentyp) wird in Delphi "immer" automatisch freigegeben,
es sei denn, man umgeht "fahrläßig"/absichtlich die Referenzzählung.


PChar selber muß nicht greigegeben werden, abgesehn von den Daten, auf welche dieser "Zeiger" zeigt,
also wenn man speicher reserviert und den "Zeiger" drauf zeigen läßt,
dann muß man diesen Speicher natürlich auch wieder freigeben.

AJ_Oldendorf 29. Jun 2009 11:38

Re: String-Result explizit freigeben
 
Ok, danke für die Antwort...
Ich meinte auch eher den Datentyp String anstatt PChar.
Das PChar ein Zeiger ist und dieser entsprechend wieder freigegeben werden muss, war mir klar.
Also wird ein String immer freigegeben, wenn man nicht manuell in die Refernzzählung eingreift, danke Himitsu

@QuickAndDirty: Find ich auch nicht unbedingt witzig...

Viele Grüße
Alex

Muetze1 29. Jun 2009 11:43

Re: String-Result explizit freigeben
 
Zitat:

Zitat von AJ_Oldendorf
Ich meinte auch eher den Datentyp String anstatt PChar.

Und wenn dieser lokal deklariert ist, wird er mit Ende der Funktion freigegeben, da dort sein referencecounter auf 0 kommt. Und damit ist der Speicher auf den der PChar vom Result zeigt (bei temporären cast) nicht mehr gültig und PChar zeigt in's Datennirvana.

Zitat:

Zitat von AJ_Oldendorf
Das PChar ein Zeiger ist und dieser entsprechend wieder freigegeben werden muss, war mir klar.

Nur wenn du wirklich mit New() oder ähnlichem Speicher alloziierst. Ein temporärer Cast von einem String alloziiert keinen Speicher sondern lässt den Zeiger auf den Dateninhalt des Strings zeigen. Somit verlieren diese PChar auch ihre Gültigkeit mit der Freigabe des zugehörigen Strings. Und durch diesen Umstand ist nichts freizugeben, da die Adresse (also der Zeiger) ein Ordinalwert ist und somit keine Speicheralloziierung braucht (eher Register EAX als Rückgabewert).


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:38 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