AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Record zurücksetzen (löschen)

Ein Thema von Guido Eisenbeis · begonnen am 14. Sep 2008 · letzter Beitrag vom 10. Okt 2008
Antwort Antwort
Seite 3 von 9     123 45     Letzte » 
Benutzerbild von SubData
SubData

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

Re: Record zurücksetzen (löschen)

  Alt 14. Sep 2008, 14:06
Zitat von Hansa:
Bei einem Record handelt es sich nunmal NICHT um Pointer etc.
Bei Strings im Record schon (Solange es keine ShortStrings) sind.
Ronny
/(bb|[^b]{2})/
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#22

Re: Record zurücksetzen (löschen)

  Alt 14. Sep 2008, 14:13
FastMM meldet jedenfalls nichts.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  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
 
#23

Re: Record zurücksetzen (löschen)

  Alt 14. Sep 2008, 14:13
Also es sieht laut FastMM4 so aus:

Delphi-Quellcode:
type
  TBeweis = packed record
    EinString: String;
    Zahl: Integer;
  end;

procedure TForm1.Button1Click(Sender: TObject);
var Beweis: TBeweis;
    p: Pointer;
begin
  Beweis.EinString:= 'Test';
  p := @Beweis.EinString[1];
  FillChar(Beweis,SizeOf(TBeweis),0);
  ShowMessage(PChar(p));
end;
erzeugt KEIN MemoryLeak. Der MemoryManager schafft es wohl trotzdem den String nach der Methode mit dem Record freizugeben.

Anders siehts bei globalen Variablen oder Klassenvariablen aus. Da hinterlässt dieser Code ein MemoryLeak. Aber auch das kann verhindert werden:

Finalize(Beweis); Diese Zeile vor dem FillChar lässt das MemoryLeak verschwinden.

Delphi-Quellcode:

// Globale- oder Klassenvariable
var Beweis: TBeweis;

procedure TForm1.Button1Click(Sender: TObject);
var
    p: Pointer;
begin
  Beweis.EinString:= 'Test';
  p := @Beweis.EinString[1];
  Finalize(Beweis); // <---
  FillChar(Beweis,SizeOf(TBeweis),0);
  ShowMessage(PChar(p));
end;
@Hansa:

Ich weiß, dass es sich bei Records nicht um Pointer handelt. Aber das hat nichts damit zu tun. Fakt ist, dass mit FillChar nur der Pointer zu dem eigentlichen String überschrieben wird. Der String selbst liegt weiterhin im Speicher! Daran ist nichts zu rütteln.
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
Popov
(Gast)

n/a Beiträge
 
#24

Re: Record zurücksetzen (löschen)

  Alt 14. Sep 2008, 14:13
Zitat von Guido Eisenbeis:
da ich bei meiner Suche nichts gefunden habe, ahne ich, dass ich da selbst Hand angelegt muss. Aber dennoch die Frage: Gibt es eine Delphi-Funktion um ein Record zu löschen? Also sowas wie MyRecord := nil?
Alle Tipps schön und gut, man muß sie sich aber immer merken und bevor man dann stundenlang überlegt wie das war, ein mal machen, immer wieder nutzen können

Delphi-Quellcode:
procedure MyRecordClear;
begin
  with MyRecord do
  begin
    Test_1 := '';
    Test_2 := '';
    Test_3 := '';
    Integer_1 := 0;
    Integer_2 := 0;
  end;
end;
Man sollte sich das Leben einfach machen.
  Mit Zitat antworten Zitat
Guido Eisenbeis

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

Re: Record zurücksetzen (löschen)

  Alt 14. Sep 2008, 14:19
Damit keine Missverständnisse auftreten:

Der (die) String(s) sollen KEINESFALLS freigegeben werden! Im Gegenteil: Sie werden ja in meinem Programm benötigt!

Sie sollen lediglich auf leer (, Integer auf 0, ...) gesetzt werden! (Speicherplatz soll beibehalten weren.)


Der "Beweis" von Neutral General beweist nur, dass der Bereich im Speicher noch die Werte beinhaltet. Das ist ja auch in Ordnung. Ich gehe davon aus, dass FillChar nur die Länge(nangabe) des Strings auf 0 setzt. Das entspräche einem leeren String = gewünschtes Ergebnis.

Speicherleck kann ich mir nicht vorstellen, da der Platz ja reserviert bleiben soll, bis die Record-Variable am Programm-Ende freigegeben wird.

Guido.
  Mit Zitat antworten Zitat
Benutzerbild von SubData
SubData

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

Re: Record zurücksetzen (löschen)

  Alt 14. Sep 2008, 14:19
@Michael: Kannst du das mal mit einer globalen ThreadVar Variable testen?
Einmal mit Finalize und einmal ohne.

Edit:
@Guido: Das siehst du leider ein wenig falsch.
Damit wird der Pointer auf den eigentlichen String überschrieben.
Das bedeutet aber nicht, dass bei einer neuen Zuweisung der String wieder an der selben Stelle im Speicher liegt.
Dementsprechend wird auch nicht die Längenangabe vom String auf 0 gesetzt, sondern der Pointer zum String.
Ronny
/(bb|[^b]{2})/
  Mit Zitat antworten Zitat
Guido Eisenbeis

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

Re: Record zurücksetzen (löschen)

  Alt 14. Sep 2008, 14:22
Zitat von Popov:
Alle Tipps schön und gut, man muß sie sich aber immer merken und bevor man dann stundenlang überlegt wie das war, ein mal machen, immer wieder nutzen können

Delphi-Quellcode:
procedure MyRecordClear;
begin
  with MyRecord do
  begin
    Test_1 := '';
    Test_2 := '';
    Test_3 := '';
    Integer_1 := 0;
    Integer_2 := 0;
  end;
end;
Was aber machst du, wenn, wie oben beschrieben, dein Record noch andere Records enthält (z. B. FindData: TWIN32FINDDATA) und die dann wieder weitere Records enthalten, die dann ... ?

Guido.
  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
 
#28

Re: Record zurücksetzen (löschen)

  Alt 14. Sep 2008, 14:23
Zitat von SubData:
@Michael: Kannst du das mal mit einer globalen ThreadVar Variable testen?
Einmal mit Finalize und einmal ohne.

Edit:
@Guido: Das siehst du leider ein wenig falsch.
Damit wird der Pointer auf den eigentlichen String überschrieben.
Das bedeutet aber nicht, dass bei einer neuen Zuweisung der String wieder an der selben Stelle im Speicher liegt.
Dementsprechend wird auch nicht die Längenangabe vom String auf 0 gesetzt, sondern der Pointer zum String.
Gleiches Ergebnis wie mit normalen globalen Variablen und Klassenvariablen. Ohne Finalize gibtsn MemoryLeak. Mit gibts keins.

@Guido Eisenbeis:

FillChar bewirkt schon, dass die Strings leer sind (leer darum, weil der Pointer zum String jetzt irgendwohin zeigt, wo kein String liegen wird). Aber wenn du das machst, musst/solltest du vorher Finalize(Record) aufrufen. Ansonsten gibt es wie gesagt ein MemoryLeak bei globalen (Thread) Variablen und Klassenvariablen.
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 SubData
SubData

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

Re: Record zurücksetzen (löschen)

  Alt 14. Sep 2008, 14:26
Danke!

Ich hab nämlich mal die böse Erfahrung gemacht, dass ich ThreadVar Records am Ende des Threads wieder explizit löschen muss, da sonst die Strings im Record MemoryLeaks verursachen.
Den Fehler muss man erstmal finden
Ronny
/(bb|[^b]{2})/
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#30

Re: Record zurücksetzen (löschen)

  Alt 14. Sep 2008, 14:26
Zitat von Guido Eisenbeis:
Was aber machst du, wenn, wie oben beschrieben, dein Record noch andere Records enthält?
Wird nur etwas länger.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 15:05 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