Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem bei FreeMem (https://www.delphipraxis.net/73318-problem-bei-freemem.html)

himitsu 15. Jul 2006 20:52

Re: Problem bei FreeMem
 
Weil der String halt nicht so arbeitet :zwinker:

str ist ja "nur" ein pointer auf die Stringstruktur


Code:
RRRRCCCCDDDDDDDDDDDDDDDDDDDDDDD.....#0
^   ^   ^                            ^
^   ^   ab hier sind dann alle Elemente (Zeichen) aufgereit
^   Elemete im Array ... entspricht beim String der Zeichenanzahl
Refferenzzähler                     ^
^                                    ^
^____________________________________^
diese Daten liegen [b]einem[/b] Speicherblock
der Zeiger in str zeigt zwar nicht wie allgemein üblich auf den Anfang des resservierten Datenbereichs, sonden aud das erste Zeichen,
dies ist allerdings nur weil es halt so einfacher ist den string nach PChar zu casten.

zur Speicherverwaltung wird demnach immer PInteger(str)-2*SizeOf(Integer) an GetMem, ReallocMem und FreeMem geleitet.
Und da gibt es Probleme, sobald du den String mal verändernfreigeben willst :warn:

Length arbeitet ja auch nur mit PInteger(PInteger(str)-SizeOf(Integer))^, was auch falsche werte liefern würd, wenn dman daran rumfummelt.

Muetze1 15. Jul 2006 22:33

Re: Problem bei FreeMem
 
Und die Funktion Delete() im Gegensatz dazu? Wie schnell/langsam ist diese dazu?

himitsu 17. Jul 2006 12:38

Re: Problem bei FreeMem
 
Jenachdem wie der MemoryManager arbeitet und wie lang gerade der String ist, ist meine "schnelle" Version vielleicht 1/16 bis 1/4 aller Fälle schneller ... bei mir wird ja der Speicherblock nicht gekürtzt und demnach entfällt eine eventuelle Änderung, was bis hin zum Kopieren des gesamten Strings gehen könnte.

Aber Delete ist meistens schonmal schneller als Copy, da es den String direkt bearbeitet.
Copy legt ja immer erst 'ne Kopie an, welche per Result übergeben wird und erst dann wird das Original durch die Kopie ersetzt.


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

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