AGB  ·  Datenschutz  ·  Impressum  







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

Record "finalisieren"

Ein Thema von CocoPops · begonnen am 2. Apr 2014 · letzter Beitrag vom 2. Apr 2014
Antwort Antwort
CocoPops
(Gast)

n/a Beiträge
 
#1

Record "finalisieren"

  Alt 2. Apr 2014, 15:02
Gemeinde.

Es tut mir schrecklich leid, wenn ich nicht die richtigen Ausdrücke und Worte finde für mein Problem.

Ich habe ein packed Record, etwa so:
Delphi-Quellcode:
type
 PData = ^TData;

 TData = packed record
   sBeispielVar: String;
end;
und folgendermaßen erzeuge ich einen neuen Datensatz, wenn erforderlich und speichere ihn/einen Verweis zum ihm (?) in einer TList:
Delphi-Quellcode:
var
 Data: PData:
begin
 New(Data);
 Data^.sBeispielVar := 'Test';
 DataList.Add(Data);
end;
Zuvor habe ich einen Eintrag mit DataList.Delete(X); gelöscht und Data finalisiert: finalize(Data^); .
Aber finalize scheint nicht thread-safe zu sein.

Die Frage ist: wird bei DataList.Delete(X); der komplette Datensatz Data, der an dieser Stelle X gespeichert ist, mit gelöscht?
  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
 
#2

AW: Record "finalisieren"

  Alt 2. Apr 2014, 15:05
Hallo,

Bedenke dass du auch Dispose aufrufen musst (oder macht das die Liste beim Delete?).

Wie ich es machen würde:
Code:
Finalize(DataList[X]^);
Dispose(DataList[X]);
DataList.Delete(X);
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
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Record "finalisieren"

  Alt 2. Apr 2014, 15:09
Dispose ruft übrigens intern schon von sich aus Finalize auf, hatte ich glaub ich mal rausgefunden.
  Mit Zitat antworten Zitat
CocoPops
(Gast)

n/a Beiträge
 
#4

AW: Record "finalisieren"

  Alt 2. Apr 2014, 15:13
Sehr interessant. Das scheint wunderbar, selbst im TThread, zu funktionieren.

Warum war denn Finalize(Data^) falsch?

Ich habe mit mal den Code von Dispose rausgesucht:
Delphi-Quellcode:
procedure _Dispose(P: Pointer; TypeInfo: Pointer);
{$IFDEF PUREPASCAL}
begin
  _Finalize(P, TypeInfo);
  FreeMem(P);
end;
{$ELSE}
asm
        { ->    EAX     Pointer to object to be disposed        }
        {       EDX     Pointer to type info                    }

{$IFDEF ALIGN_STACK}
        SUB ESP, 8
{$ENDIF ALIGN_STACK}
        PUSH EAX
        CALL _Finalize
        POP EAX
{$IFDEF ALIGN_STACK}
        SUB ESP, 4
{$ENDIF ALIGN_STACK}
        CALL _FreeMem
{$IFDEF ALIGN_STACK}
        ADD ESP, 12
{$ENDIF ALIGN_STACK}
end;
{$ENDIF !PUREPASCAL}
Finalize ist wirklich vertreten, aber mit einer Bedingung verknüpft.

Und in der selben Unit wird, wenn Dispose(P); aufgerufen wird, auch niemals Finalize aufgerufen.
Demnach scheint Finalize wirklich immer aufgerufen zu werden, wenn man Dispose aufruft.

Geändert von CocoPops ( 2. Apr 2014 um 15:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

AW: Record "finalisieren"

  Alt 2. Apr 2014, 15:37
GetMem und FreeMem = ohne Initialize und Finalize
New und Dispose = mit Initialize und Finalize


Setzt Finalize den Speicher eigentlich auch auf 0/nil, oder gibt es die verlinkten Speicher "nur" frei?
Wenn nicht auf nil gesetzt wird, dann ist ein "doppelter" Aufruf von Finalize falsch und kann/wird zu netten Fehlern führen.



Welche Delphi-Version? (es kann nie schaden das im Profil anzugeben, oder zumindestens in den Posts)
Ab D2009 könnte man auch eine generischen Liste verwenden und das New/Dispose wegzulassen.
Jenachdem wie oft die Records umgeschaufelt oder später verändert werden.

Da hier eh mit Pointer gearbeitet wird und wenn das "jenachdem" nicht zutrifft, dann doch eher eine generische Liste, mit einem Data-Objekt, statt dem Record.


Zitat:
Data^.sBeispielVar
PS: Delphi kann das auch implizit dereferenzieren, wenn ein Punkt folgt.
Data.sBeispielVar
$2B or not $2B

Geändert von himitsu ( 2. Apr 2014 um 16:02 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: Record "finalisieren"

  Alt 2. Apr 2014, 15:41
[edit] Doppelpost gelöscht
$2B or not $2B

Geändert von himitsu ( 2. Apr 2014 um 16:02 Uhr)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Record "finalisieren"

  Alt 2. Apr 2014, 15:47
Setzt Finalize den Speicher eigentlich auch auf 0/nil, oder gibt es die verlinkten Speicher "nur" frei?
Wenn nicht auf nil gesetzt wird, dann ist ein "doppelter" Aufruf von Finalize falsch und kann/wird zu netten Fehlern führen.
Finalize mehrfach aufzurufen macht soweit ich weiß nichts, also nehme ich an, dass die entsprechenden Speicherstellen auf nil gesetzt werden.
  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
 
#8

AW: Record "finalisieren"

  Alt 2. Apr 2014, 16:41
Ich glaube das Problem war dass er Dispose einfach gar nicht aufgerufen hat.
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
Antwort Antwort


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 02:22 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