![]() |
Re: String Gültigkeit + PChar Verwendung
ok, vielen Dank :-)
|
Re: String Gültigkeit + PChar Verwendung
Ein String muss auch die ganze Prozedur über auf dem Stack liegen, damit diese dynamische Variable (die ja vom Compiler verwaltet wird) auch immer zuverlässig freigegeben wird.
Dazu legt Delphi um die gesamte Prozedur automatisch ein try..finally, damit asuch im Fehlerfall der String freigegeben werden kann. dazu muss er allerdings immer auf dem Stack liegen (jeder Thread hat übrigens seinen eigenen Stack). Ich wüsste nicht, dass die Code-Optimierung einen String in die Register schiebt. |
Re: String Gültigkeit + PChar Verwendung
Zitat:
(dann entsteht auch ein Speicherleck, wenn man es mal in einer Schleife testet) Wie müsste ich den String dann sauber selber freigeben? Und Manchmal steht der RefCount vom String in normalen Proceduren manchmal auf -1? |
Re: String Gültigkeit + PChar Verwendung
auf -1 steht der, wenn er nicht im Speicher liegt.
z.B. wenn er von einer Konstante "geladen" wurde. |
Re: String Gültigkeit + PChar Verwendung
Zitat:
|
Re: String Gültigkeit + PChar Verwendung
an RefCount direkt würde ich nicht rumspielen.
ich behandle zwar Stringvaiablen wie Pointer (was sie ja im Grunde auch sind) und so kann man nette Dinge mit machen, aber ein "schöner" Weg ist das nicht gerade (wenn er auch einfach ist), aber wie du schon bemerkt hast, kann man sich so (falls man nicht aufpasst) ein Speicherleck einfangen. was hindert dich eigentlich daran selber Speicher zu resservieren und freizugeben?
Delphi-Quellcode:
jetzt kannst du mit P alles machen, was du willst
Var P: PChar;
P := GetMemory(Length(S) + 1); MoveMemory(P, PChar(S), Length(S) + 1); und wenn der String nicht mehr benötigt wird, dann den Speicher per FreeMemory(P) wieder freigen. |
Re: String Gültigkeit + PChar Verwendung
Zitat:
![]() ich will PChars auf den String halten, aber sicher sein, dass ich nicht ungültige PChars halte. Falls doch mal jemand bei meinem StringExploder auf die Idee kommt, ihn länger zu haben, als die Procedure dauert :-) Und ich jedes Kopieren oder Anlegen von Speicher vermeiden will :) In dieser Lösung ... |
Re: String Gültigkeit + PChar Verwendung
dann hat sich derjenige selbst drum zu kümmern, daß sein String lang genug am Leben bleibt.
schließlich hättest du dann noch das Problem mit dem Speicherleck. oder wie meinst du soll dann bestimmt werden, wann der String freigegeben werden darf, bzw. wo willst du dann das Freigeben des String veranlassen (wenn deine Prozedure schon lange beendet ist)? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:29 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