![]() |
AW: und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)
Zitat:
Am Ehesten kannst due es mir Records in Delphi vergleichen. |
AW: und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)
Danke, eure antworten haben mir sehr geholfen.
Ich möchte noch ein kleines beispiel einfügen das mir beim unterscheiden von obijektvariablen und obijektreferenzen geholfen hat: Zitat:
![]() Also wird in delphi von natur aus alles bis auf den Zeiger im heap gespeichert? |
AW: und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)
Zitat:
Wenn du das mit dem von C++ vergleichen möchtest, dann liegst du völlig falsch, denn in Delphi entspricht das den Records.
Delphi-Quellcode:
type
THersteller = string[99]; PAuto = ^TAuto; TAuto = record Hersteller : THersteller; constructor Create( Hersteller : THersteller ); end; { TAuto } constructor TAuto.Create( Hersteller : THersteller ); begin Self.Hersteller := Hersteller; end; procedure Test2; var myCar : TAuto; begin myCar := TAuto.Create( 'BMW' ); Writeln( SizeOf( myCar ) ); // -> 100 end; procedure Test3; var myCar : PAuto; begin myCar := New( PAuto ); try myCar^ := TAuto.Create( 'BMW' ); Writeln( SizeOf( myCar ) ); // -> 4 finally Dispose( myCar ); end; end; |
AW: und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)
Die C++ Speicherverwaltung lässt sich am besten mit Delphi's
Delphi-Quellcode:
Typ vergleichen:
object
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. Zitat:
Delphi-Quellcode:
;)
object
Zitat:
Delphi-Quellcode:
und
New
Delphi-Quellcode:
! Das Äquivalent zu
FreeMem
Delphi-Quellcode:
ist
New
Delphi-Quellcode:
und das zu
Dispose
Delphi-Quellcode:
ist
FreeMem
Delphi-Quellcode:
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
GetMem
Delphi-Quellcode:
mit einem
record
Delphi-Quellcode:
(kein
String
Delphi-Quellcode:
) mit Hilfe von
ShortString
Delphi-Quellcode:
freigibst, dann hast du ein Memoryleak, weil der Referenzzähler des Strings nicht runtergezählt wird.
FreeMem
Gruß, Sven |
AW: und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)
Zitat:
|
AW: und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)
Zitat:
Zitat:
Code:
?
{
CKlasse obj(..); CKlasse* ptrObj = new CKlasse(..); CKlasse& refObj = *ptrObj; } |
AW: und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)
Danke für eure zahlreichen antworten.
@ Sir Rufus: Ich verstehe nicht was records damit zu tun haben, ich dachte das wäre sowas wie struct(c++) nur für delphi.
Delphi-Quellcode:
Wären die 100 Bytes nicht dank der automatischen derefernzierung trotzdem im heap gespeichert und im stack wird (vom compiler automatisch) ein zeiger darauf hinterlegt? (möglicherweise habe ich es doch falsch verstanden).
procedure Test2;
var myCar : TAuto; begin myCar := TAuto.Create( 'BMW' ); Writeln( SizeOf( myCar ) ); // -> 100 end; Sollte meine oben gennante aussage stimmen, wären dann nicht in delphi selbsterstellte zeiger ziemlich überflüssig? lg Simon |
AW: und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)
Du versuchst hier Birnen mit Äpfel zu vergleichen.
C++ arbeitet anders als Delphi und daher muss man eben diese Besonderheiten berücksichtigen und kann da nicht stumpf 1:1 den Code umsetzen. Ein Mazda RX-7 und ein Nissan 370ZX zu vergleichen geht schon (starten, fahren, tanken, ...), aber wenn man dann die Motoren auseinandernimmt ist und vergleichen will, hat man ein Problem, denn es sind 2 grundverschiedene Konzepte (Wankel <-> Otto) und trotzdem können beide fahren. Somit wollte ich nur sagen, dass man das, was du da als C++ Beispiel hattest, in Delphi am ehesten mit Records vergleichen kannst, es ist aber nicht exakt dasselbe. |
AW: und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)
Herzlichen danke,
könntest du mir (oder jemand anderes) auch noch diese frage beantworten:
Delphi-Quellcode:
Werden die 100 Bytes dank der automatischen derefernzierung im heap gespeichert und im stack wird (vom compiler automatisch) ein zeiger darauf hinterlegt? (möglicherweise habe ich es falsch verstanden).
procedure Test2;
var myCar : TAuto; begin myCar := TAuto.Create( 'BMW' ); Writeln( SizeOf( myCar ) ); // -> 100 end; lg simon |
AW: und C++ Speicherreservierung von Instanzen/Obijekten // (MS visual studio 2013)
Zitat:
Zitat:
Delphi-Quellcode:
und da gibt es keine automatische Dereferenzierung (Verhält sich ähnlich zu Klassen in C++).
TAuto = record
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:06 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