AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Record zurücksetzen (löschen)

Ein Thema von Guido Eisenbeis · begonnen am 14. Sep 2008 · letzter Beitrag vom 10. Okt 2008
Antwort Antwort
Seite 6 von 9   « Erste     456 78     Letzte »    
Benutzerbild von FAlter
FAlter

Registriert seit: 21. Jul 2004
Ort: Ostfildern
1.096 Beiträge
 
FreePascal / Lazarus
 
#51

Re: Record zurücksetzen (löschen)

  Alt 14. Sep 2008, 19:52
Hi,

Zitat von Hansa:
Zitat von Christian Seehase:
Ausserdem sind Huge-Strings auch die Standardeinstellung.
Hast Du es bei Dir umgestellt?
Ne, nichts umgestellt. Warum auch ? Die Screenshots wurden produziert mit Projektoptionen-Checkbox "Huge-Strings" angehakt. Mache ich aus dem string [10] nur string, dann gehts genauso. @DeddyH
Vom Effekt her scheint es gleich zu sein, allerdings wird der Speicher nicht freigegeben, den die Strings belegen, sondern nur der Zeiger auf nil gesetzt (was bei Delphi Leerstring bedeutet).

Mfg
FAlter
Felix Alter
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#52

Re: Record zurücksetzen (löschen)

  Alt 14. Sep 2008, 23:41
Zitat von Hansa:
Ne, nichts umgestellt. Warum auch ? Die Screenshots wurden produziert mit Projektoptionen-Checkbox "Huge-Strings" angehakt. Mache ich aus dem string [10] nur string, dann gehts genauso. @DeddyH
Ich würde mal sagen: Damit wäre

Zitat von Neutral General:
Mir scheint, als hätte er nicht verstanden, worum es hier in dieser Diskussion geht.
bewiesen

Natürlich wird der String auch ohne Finalize zu einem Leerstring. Allerdings hinterlässt du ein MemoryLeak.

Du machst quasi folgendes:

Delphi-Quellcode:
var pc: PChar;
begin
  GetMem(pc,6);
  // mit PChar arbeiten
  pc := nil; // = FillChar(String,SizeOf(String),0);
end;
Ich denke du siehst, dass obiger Code ein MemoryLeak verursacht. Richtig wäre es so:

Delphi-Quellcode:
var pc: PChar;
begin
  GetMem(pc,6);
  // mit PChar arbeiten
  FreeMem(pc); // Finalize(RecordmitString);
  pc := nil; // = FillChar(RecordmitString,SizeOf(TRecordmitString),0);
end;
Ich hoffe, du hast jetzt verstanden worum es geht. Im Endeffekt ist pc immer nil. Das Ergebnis ist scheinbar das Gleiche.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#53

Re: Record zurücksetzen (löschen)

  Alt 14. Sep 2008, 23:57
Hm.

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?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#54

Re: Record zurücksetzen (löschen)

  Alt 15. Sep 2008, 00:03
Zitat von Luckie:
Was passiert eigentlich mit String Attributen, wenn man des Objekt auf nil setzt?
Der String liegt weiterhin im Speicher rum und wird nicht freigegeben. (MemoryLeak)
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#55

Re: Record zurücksetzen (löschen)

  Alt 15. Sep 2008, 00:12
Das ist ja Müll.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#56

Re: Record zurücksetzen (löschen)

  Alt 15. Sep 2008, 00:15
Was hast du denn erwartet/gehofft?
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#57

Re: Record zurücksetzen (löschen)

  Alt 15. Sep 2008, 00:25
Dass der MemoryManager erkennt, dass es sich um Strings handelt und den Speicher entsprechend freigibt.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von SubData
SubData

Registriert seit: 14. Sep 2004
Ort: Stuhr
1.078 Beiträge
 
Delphi 11 Alexandria
 
#58

Re: Record zurücksetzen (löschen)

  Alt 15. Sep 2008, 08:10
So... Und ich hab da auch mal was nettes:

Folgendes Konstrukt:
Delphi-Quellcode:
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 Anfang des Threads werden alle Felder gefüllt bzw. irgendwann im laufenden Thread.

Am Ende des Threads wird folgendes aufgerufen:

Delphi-Quellcode:
    Finalize(tv);
    FillChar(tv, SizeOf(tv), 0);
Und was passiert?

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...
Ronny
/(bb|[^b]{2})/
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#59

Re: Record zurücksetzen (löschen)

  Alt 15. Sep 2008, 09:49
Zitat von Luckie:
Was passiert eigentlich mit String Attributen, wenn man des Objekt auf nil setzt?
Zitat:
Speicherleck ....... Ist ja Müll ...... Was hast du denn erwartet?
Zitat von Luckie:
Dass der MemoryManager erkennt, dass es sich um Strings handelt und den Speicher entsprechend freigibt.
Wir sind heir doch nicht in .NET (oder Java)

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
  Mit Zitat antworten Zitat
Guido Eisenbeis

Registriert seit: 9. Apr 2006
389 Beiträge
 
Delphi 10.3 Rio
 
#60

Re: Record zurücksetzen (löschen)

  Alt 16. Sep 2008, 19:36
@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!

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!

Guido.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 6 von 9   « Erste     456 78     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:23 Uhr.
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