AGB  ·  Datenschutz  ·  Impressum  







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

String-Result explizit freigeben

Ein Thema von AJ_Oldendorf · begonnen am 29. Jun 2009 · letzter Beitrag vom 29. Jun 2009
Antwort Antwort
AJ_Oldendorf

Registriert seit: 12. Jun 2009
385 Beiträge
 
Delphi 12 Athens
 
#1

String-Result explizit freigeben

  Alt 29. Jun 2009, 11:49
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: String-Result explizit freigeben

  Alt 29. Jun 2009, 12:11
PChar ist ja nur ein Zeiger auf einen String. Der Speicherbereich, der von ihm referenziert wird, wird natürlich nicht automatisch Freigeben
Markus Kinzler
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#3

Re: String-Result explizit freigeben

  Alt 29. Jun 2009, 12:13
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 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.
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.926 Beiträge
 
Delphi 12 Athens
 
#4

Re: String-Result explizit freigeben

  Alt 29. Jun 2009, 12:18
Mein GOTT...
Lade lieber mal Robert zu diesem Thread ein. Ich denke du hast ihn gaaaanz falsch verstanden.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: String-Result explizit freigeben

  Alt 29. Jun 2009, 12:19
@QuickAndDirty: Das ist nicht witzig!
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: String-Result explizit freigeben

  Alt 29. Jun 2009, 12:21
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
AJ_Oldendorf

Registriert seit: 12. Jun 2009
385 Beiträge
 
Delphi 12 Athens
 
#7

Re: String-Result explizit freigeben

  Alt 29. Jun 2009, 12:38
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
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#8

Re: String-Result explizit freigeben

  Alt 29. Jun 2009, 12:43
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 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).
  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 05:36 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