![]() |
Re: Record zurücksetzen (löschen)
Hi,
Zitat:
Mfg FAlter |
Re: Record zurücksetzen (löschen)
Zitat:
Zitat:
Natürlich wird der String auch ohne Finalize zu einem Leerstring. Allerdings hinterlässt du ein MemoryLeak. Du machst quasi folgendes:
Delphi-Quellcode:
Ich denke du siehst, dass obiger Code ein MemoryLeak verursacht. Richtig wäre es so:
var pc: PChar;
begin GetMem(pc,6); // mit PChar arbeiten pc := nil; // = FillChar(String,SizeOf(String),0); end;
Delphi-Quellcode:
Ich hoffe, du hast jetzt verstanden worum es geht. Im Endeffekt ist pc immer nil. Das Ergebnis ist scheinbar das Gleiche.
var pc: PChar;
begin GetMem(pc,6); // mit PChar arbeiten FreeMem(pc); // Finalize(RecordmitString); pc := nil; // = FillChar(RecordmitString,SizeOf(TRecordmitString),0); end; |
Re: Record zurücksetzen (löschen)
Hm. :gruebel:
also Records sind ja sowieso nicht mehr ganz OOP konform. Gerad ein so einen Fall bieten sich klassen an, da Klassen Daten und Methoden die Daten zu manipulieren kapseln. Da würde ich dann eine Methode Init schreiben, die die Attribute auf einen definierten Wert setzt. Was passiert eigentlich mit String Attributen, wenn man des Objekt auf nil setzt? |
Re: Record zurücksetzen (löschen)
Zitat:
|
Re: Record zurücksetzen (löschen)
Das ist ja Müll.
|
Re: Record zurücksetzen (löschen)
Was hast du denn erwartet/gehofft? :gruebel:
|
Re: Record zurücksetzen (löschen)
Dass der MemoryManager erkennt, dass es sich um Strings handelt und den Speicher entsprechend freigibt.
|
Re: Record zurücksetzen (löschen)
So... Und ich hab da auch mal was nettes:
Folgendes Konstrukt:
Delphi-Quellcode:
Am Anfang des Threads werden alle Felder gefüllt bzw. irgendwann im laufenden Thread.
type
TThreadVars = record sServerHost : String; sRemoteIP : String; sPHPSession : String; sVar1 : String; sVar2 : String; sVar3 : String; sVar4 : String; sVar5 : String; dVar1 : TDateTime; iVar1 : Int64; (* --- Request Infos --- *) pThread : ^TIdContext; pRequest : ^TIdHTTPRequestInfo; pResponse : ^TIdHTTPResponseInfo; end; threadvar tv : TThreadVars; Am Ende des Threads wird folgendes aufgerufen:
Delphi-Quellcode:
Und was passiert?
Finalize(tv);
FillChar(tv, SizeOf(tv), 0); Richtig, ich hab ein Memory Leak. Allerdings nur in den ersten 3 String Variablen. Wenn ich diese per Hand auf zurücksetze ( var := ''; ) dann ist das Memory Leak weg... |
Re: Record zurücksetzen (löschen)
Zitat:
Zitat:
Zitat:
Da reicht ein nil setzen volkomen aus, und der Memorymanager(/GC) kümmert sich um den Rest ;) Zum Thema: Eine Klasse wäre natürlich praktischer. Dann kannst du auch direkt die Klasse Thread-Safe implementieren und alles sollte klappen :stupid: |
Re: Record zurücksetzen (löschen)
@All
OK, ... ich ... schreibe ... jetzt ... mal ... sehr ... langsam und lasse mir Zeit, bevor ich diese Posting losschicke. Ich will mich eigentlich schon die ganze Zeit bedanken für die rege Beteiligung und die wirklich guten Infos. Aber jedes Mal wenn ich ansetze, um dies zu schreiben kommen in der Zwischenzeit wieder neue Beiträge. ;-) Ihr seid richtig flott! Ich bin erfreut und beeindruckt, was hier eine rege Diskussion entstanden ist. Ich habe an einem bestimmten Punkt gedacht, dass die FillChar-Möglichkeit eine Lösung für das Thema meines Threads ist. Dann kamen neue Infos und ich begann über die Speicherlecks zu grübeln. Dann war wieder alles klar, und nach einigen weiteren Post gings von vorne los. Ich träume schon von Speicherlecks! :cyclops: Nun habe ich mich entschieden, dass die FillChar-Lösung die richtige für mein Problem ist und werde sie verwenden. Ich habe auch ein kleines Demo dazu geschrieben. Das fasst zwar im Prinzip nur die hier geposteten Infos zusammen, aber wenn Interesse besteht, werde ich das Demo gerne hier posten. Ansonsten freue ich mich auch weiterhin über Infos, die zu diesem Thema beitragen! :P Guido. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:48 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