Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Speicherbereinigung von Strings (https://www.delphipraxis.net/95899-speicherbereinigung-von-strings.html)

3_of_8 15. Jul 2007 14:51


Speicherbereinigung von Strings
 
Morgen.

Ich habe ein kleines Problem.

Ich speichere einen Pointer auf einen String in einer Datenstruktur. Da stellt sich natürlich die Frage: Wann gibt der Speichermanager den String frei? Kann es sein, dass von dem String nichts mehr übrig ist, wenn ich den Pointer wieder aus der Struktur hole? Muss ich den String in eine Wrapper-Klasse verpacken?

alzaimar 15. Jul 2007 15:14

Re: Speicherbereinigung von Strings
 
Ohne genau probiert zu haben, denke ich, das der String freigegeben wird, wenn der Kontext verlassen wird. Seine Adresse ist dann imho nicht mehr gültig. Zeig doch mal Code, würde mich nämlich auch interessieren.

3_of_8 15. Jul 2007 15:21

Re: Speicherbereinigung von Strings
 
Ich bin noch in der Planungsphase. Im Prinzip wäre das aber so, dass ich sowas bräuchte wie eine HashMap<String, String> in Java, also eine String zu String-Map. Am einfachsten wäre es gewesen, wenn ich meine bereits vorhandene HashMap<String, Pointer>-Klasse nehmen würde, und einfach einen Pointer auf den String legen würde. Ich probiers mal aus.

Dax 15. Jul 2007 16:17

Re: Speicherbereinigung von Strings
 
Ein String wird dann freigegeben, wenn keine Referenz mehr auf ihn existiert. Damit hat alzaimar für die Mehrzahl der Fälle (globale Variablen, Felder und lokale Variablen, die an höhere Gültigkeitsbereiche durchgereicht werden) recht. Den String musst du nicht unbedingt in eine Klasse packen, ein Record tut es genauso - allerdings ist der String selbst intern auch eine Art Klasse, also kannst du auch einfach nach Pointer und zurück casten ;)

3_of_8 15. Jul 2007 16:41

Re: Speicherbereinigung von Strings
 
Ja, kann ich - aber der Speichermanager macht Hackfleisch daraus, hab es grad getestet. Mit nem record hab ichs jetzt nicht probiert, aber der String wurde offenbar freigegeben, das letzte Zeichen war unbrauchbar, nachdem ich den Pointer dereferenziert habe. Jetzt habe ich ihn in eine Klasse gewrappt und das ganze funktioniert. Danke trotzdem.

Hawkeye219 15. Jul 2007 18:18

Re: Speicherbereinigung von Strings
 
Hallo,

ein einfacher TypeCast auf Pointer dürfte nicht ausreichen, damit unterläuft man die Referenzzählung. Zum Speichern und späteren Auslesen der Strings über Pointer kann man wie folgt vorgehen:

Delphi-Quellcode:
var
  List : TList;
  i : Integer;
  ps : PString;
begin
  List := TList.Create;

  for i := 0 to 9 do
    begin
      New (ps);
      ps^ := IntToStr(i);
      List.Add(ps);
    end;

  {...}

  for i := 0 to 9 do
    begin
      ps := PString(List[i]);
      ShowMessage (ps^);
    end;

  for i := 0 to 9 do
    Dispose (PString(List[i]));

  List.Free;
end;
Das TList-Objekt ist natürlich nur ein Platzhalter für die tatsächliche Datenstruktur.

Gruß Hawkeye

3_of_8 15. Jul 2007 18:33

Re: Speicherbereinigung von Strings
 
Das wollte ich so ungefähr wissen. Ich finde aber fast, dass eine Wrapper-Klasse eleganter ist.

sirius 15. Jul 2007 20:21

Re: Speicherbereinigung von Strings
 
Oder du zählst einfach den Referenzzähler eins hoch. Der liegt 8 Byte vor der Stringaddresse. (und hinterher natürlich wieder eins runter :mrgreen:

alzaimar 17. Jul 2007 06:29

Re: Speicherbereinigung von Strings
 
Geht das nur mit:
Delphi-Quellcode:
InterlockedIncrement(PInteger (Integer(MyString)-8)^);
oder gibt es da eine elegantere Methode, wie z.B. eine Art _AddRef?

[edit] Adresse des Strings berichtigt. @MyString ist die Adresse des Pointers, nicht der Speicherbereich des Strings![/edit]

sirius 17. Jul 2007 07:27

Re: Speicherbereinigung von Strings
 
An sowas dachte ich. Habe ich bisher auch nicht anders gemacht. Aber warum Lock Inc?


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:35 Uhr.
Seite 1 von 3  1 23      

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