Die C++ Speicherverwaltung lässt sich am besten mit Delphi's
object
Typ vergleichen:
Delphi-Quellcode:
type
CKlasse = object
function anzahl: LongInt;
end;
PCKlasse = ^CKlasse;
function CKlasse.anzahl: LongInt;
begin
anzahl := 42;
end;
var
aktuelleanzahl: LongInt;
Klassenvariable: PCKlasse;
begin
aktuelleanzahl := 0;
Klassenvariable := Nil;
(* es gibt noch ne spezielle New() Syntax um Konstruktoren mit
* Parametern aufzurufen, die müsste ich aber erstmal noch
* nachschauen... :/
*)
New(Klassenvariable);
(* hier wundere ich mich gerade, dass dein C++ Compiler sich nicht
* darüber beschwert, dass es Klassenvariable->anzahl() heißen
* muss... :/
*)
aktuelleanzahl := Klassenvariable^.anzahl;
Dispose(Klassenvariable);
end.
In C++ kann man auch eine Klasse ohne den ganzen Zeiger / referenzen kram erstellen. Wie würde das in Delphi aussehen?
Wie schon von Mikkey geschrieben, gibt es dafür in Delphi und C# kein Pendant, da dort Objekte (Instanzen von Klassen) immer nur eine Referenz auf einen Speicherbereich sind und man dadurch den Vorteil hat, es nicht explizit dereferenzieren zu müssen (Der Nachteil ist, man muss die Objekte immer selber erstellen / Speicher anfordern (create) und bei Delphi unter Windows auch wieder freigeben).
Am Ehesten kannst due es mir Records in Delphi vergleichen.
Im Gegensatz zu C# hat Delphi dafür ein Pendant:
object
Delphi-Quellcode:
procedure Test3;
var
myCar : PAuto;
begin
myCar := New( PAuto );
try
myCar^ := TAuto.Create( 'BMW' );
Writeln( SizeOf( myCar ) ); // -> 4
finally
FreeMem( myCar );
end;
end;
Mix doch bitte nicht
New
und
FreeMem
! Das Äquivalent zu
New
ist
Dispose
und das zu
FreeMem
ist
GetMem
und es gibt einen wichtigen Unterschied zwischen den beiden Paaren: erstes kümmert sich um die Initialisierung/Finalisierung von Managed Typen (Strings (AnsiString, UnicodeString), Interfaces, Dynamische Arrays), aber das zweite Paar macht das nicht. Wenn du also ein
record
mit einem
String
(kein
ShortString
) mit Hilfe von
FreeMem
freigibst, dann hast du ein Memoryleak, weil der Referenzzähler des Strings nicht runtergezählt wird.
Gruß,
Sven