Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi String freigeben nur wo? (https://www.delphipraxis.net/199757-string-freigeben-nur-wo.html)

EWeiss 18. Feb 2019 12:45

AW: String freigeben nur wo?
 
Hmm.. musste es doch nochmal ändern.
Es funktioniert nur beim ersten mal wird die gleiche Funktion nochmals aufgerufen dann kracht es mit invaliden Pointer.

Delphi-Quellcode:
  { linked List freigeben }
   while LineStart <> nil do begin
     FPBuffer := LineStart;
     LineStart := FPBuffer.Ptr;
     { Bei Dispose kümmert sich der Compiler um das Finalize }
     Dispose(FPBuffer);
   end;
   { keine dangling Pointer hinterlassen }
   FPBuffer := nil;
   FToPBuffer := nil;
so geht's.

Delphi-Quellcode:
  Count := LineStart.Max;
  for i := 0 to Count do
  begin
    FPBuffer := LineStart;
    LineStart := FPBuffer.Ptr;
    Dispose(FPBuffer);
  end;

  Dispose(LineStart);

  FPBuffer := nil;
  FToPBuffer := nil;
  LineStart := nil;
finde den Fehler bei deiner Variante leider nicht.

gruss

Dennis07 18. Feb 2019 14:07

AW: String freigeben nur wo?
 
Warum benutzt du nicht einfach PChar für Strings, die du selber verwalten willst? Oder, meinetwegen, WideString.
Denn "String" ist halt referenzgezählt und wird selber erzeugt und freigegeben. Bei "PChar" hast du auch schon "StrNew" und "StrDispose".

EWeiss 18. Feb 2019 14:43

AW: String freigeben nur wo?
 
[QUOTE=Dennis07;1425881]Warum benutzt du nicht einfach PChar für Strings, die du selber verwalten willst? Oder, meinetwegen, WideString.QUOTE]

Weil ich es nun mal auf string ausgelegt habe und ja die sind auch Unicodefähig zumindest ab Delphi 2009 glaube ich.
Und im Grunde genommen sind Strings in Delphi schon mächtig.
Warum soll ich mich dann mit PChar (PWideChar) rumschlagen wenn es auch so geht.

Sorry aber ich habe keine Lust jetzt meine Library deshalb wieder komplett umzumodeln.
Für Außenstehende ist das einfach zu erfragen warum machst du das nicht so oder so. ;)

Zitat:

Denn "String" ist halt referenzgezählt und wird selber erzeugt und freigegeben
referenzgezählt stimme ich zu.
selbst freigegeben.. nein sonst müsste ich mir nicht die Arbeit machen oder?

gruss

Blup 27. Feb 2019 12:03

AW: String freigeben nur wo?
 
Zitat:

Zitat von EWeiss (Beitrag 1425885)
selbst freigegeben.. nein sonst müsste ich mir nicht die Arbeit machen oder?

Diese Arbeit ist überflüssig, wie kommt man auf so eine Idee?
Delphi-Quellcode:
...
sBuffer := '';
Reicht völlig aus.

Strings verhalten sich wie Interfaces, Stringvariablen wie Interfacevariablen.
Ein String belegt einen bestimmten Speicherbereich, fällt der Referenzzähler des Strings auf 0, wird dieser an den Speichermanager als frei gemeldet.
(Das heist nicht das der Speichermanager diesen auch sofort an Windows frei gibt oder mit Nullen überschreibt.)
Wird ein String sowohl einer Variablen als auch einer Liste zugewiesen, wird trotzdem nur einmal Speicher belegt. Nur der Referenzzähler erhöht sich bei jeder Zuweisung.
Wird der Speicherbereich gelöscht, verweisen natürlich auch beide auf den gelöschten Speicher. Das ist natürlich nicht erwünscht.

EWeiss 27. Feb 2019 19:41

AW: String freigeben nur wo?
 
Zitat:

Reicht völlig aus.
Thema war schon abgeschlossen aber gut..

Eben nicht!
Denn so hatte ich es vorher weil ich das auch angenommen habe.

Aber!
Wie im ersten Beitrag schon erwähnt EurekaLog gibt mir dann diese Speicherlecks.
Wenn meine vorherige Herangehensweise den String zu löschen richtig ist\wäre dann taugt EurekaLog nichts :)

gruss


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