AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Bladefire · begonnen am 28. Jul 2014 · letzter Beitrag vom 1. Aug 2014
 
Benutzerbild von JamesTKirk
JamesTKirk

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

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

  Alt 31. Jul 2014, 06: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
 


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 12:53 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz