![]() |
Re: Problem bei FreeMem
Weil der String halt nicht so arbeitet :zwinker:
str ist ja "nur" ein pointer auf die Stringstruktur
Code:
der Zeiger in str zeigt zwar nicht wie allgemein üblich auf den Anfang des resservierten Datenbereichs, sonden aud das erste Zeichen,
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 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. |
Re: Problem bei FreeMem
Und die Funktion Delete() im Gegensatz dazu? Wie schnell/langsam ist diese dazu?
|
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 12:43 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