Einzelnen Beitrag anzeigen

Benutzerbild von JamesTKirk
JamesTKirk

Registriert seit: 9. Sep 2004
Ort: München
604 Beiträge
 
FreePascal / Lazarus
 
#14

AW: und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)

  Alt 31. Jul 2014, 07:39
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
Sven
[Free Pascal Compiler Entwickler]
this post is printed on 100% recycled electrons
  Mit Zitat antworten Zitat