Delphi-PRAXiS
Seite 3 von 3     123

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   records oder klassen? (https://www.delphipraxis.net/189248-records-oder-klassen.html)

Bambini 9. Jun 2016 08:24

AW: records oder klassen?
 
Zitat:

Zitat von JayZ (Beitrag 1339802)
ich verstehe is immer noch nicht :(
wenn ich classen benutze ist ja klar das ich die erstellen (create) und löschen (free) muss wie sieht die speicherveerwaltung denn bei records aus? muss ich das auch freigen?

Ja, wenn man diese mit New() erzeugt.

Blup 9. Jun 2016 08:28

AW: records oder klassen?
 
Das hängt davon ab, wie du Records benutzt.
Allgemein kann man sagen:

Wird ein Record als Zeiger deklariert:
- mit New() erstellen und dem Zeiger zuweisen
- mit Dispose() freigegeben (Zeiger ist danach ungültig)
Delphi-Quellcode:
type
  PMyRecord = ^TMyRecord;
  TMyRecord = record
    ID: Integer;
    Name: string;
  end;

var
  P: PMyRecord;
begin
  New(P);
  try
    TuWasMit(P);
  finally
    Dispose(P);
  end;
end;
Wird ein Record direkt als Variable deklariert, kümmert sich der Compiler:
- um die Bereitstellung des Speichers beim Eintritt in den Gültigkeitsbereich
- um die Freigabe des Speichers beim Verlassen des Gültigkeitsbereichs
Delphi-Quellcode:
type
  PMyRecord = ^TMyRecord;
  TMyRecord = record
    ID: Integer;
    Name: string;
  end;

var
  R: TMyRecord;
begin
  TuWasMit(^R);
end;

bra 9. Jun 2016 08:50

AW: records oder klassen?
 
Zitat:

Zitat von JayZ (Beitrag 1339802)
ich verstehe is immer noch nicht :(
wenn ich classen benutze ist ja klar das ich die erstellen (create) und löschen (free) muss wie sieht die speicherveerwaltung denn bei records aus? muss ich das auch freigen?

Nein, eben nicht. Das macht es einfacher, weil man Records z.B. als Parameter oder Rückgabewert von Funktionen verwenden kann, ohne sich Gedanken machen zu müssen, wo man die wieder freigeben muss. Allerdings wird der Speicherverbrauch bei exzessiven Gebrauch dann höher sein, weil bei jedem Parameter der übergeben wird, eine Kopie des Records erstellt wird.

Blup 9. Jun 2016 11:46

AW: records oder klassen?
 
Ob bei der Parameterübergabe eine Kopie oder nur eine Referenz (praktisch ein Zeiger auf den übergebenen Record, aber vor dem Entwickler verborgen) übergeben wird, kann man aber mit den Schlüsselworten const, var oder out steuern.
Delphi-Quellcode:
procedure TuWasMitPointer(P: PMyRecord);
begin
  P^.ID  := 1;
  P^.Name := 'Test';
end;

procedure TuWasMitReferenz(var R: TMyRecord);
begin
  R.ID  := 1;
  R.Name := 'Test';
end;

procedure TuWasMitReferenz(out R: TMyRecord);
begin
  R.ID := 1;
  R.Name := 'Test';
end;
Die Prozeduren erzeugen genau den selben Code. Der Compiler führt beim Compilieren aber unterschiedliche Prüfungen aus und kann den Entwickler so bei falscher Benutzung warnen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:27 Uhr.
Seite 3 von 3     123

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