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
Antwort Antwort
Seite 1 von 2  1 2      
Bladefire

Registriert seit: 30. Jun 2014
67 Beiträge
 
#1

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

  Alt 28. Jul 2014, 06:11
Hallo,

ich lerne gerade ein bisschen C++, jedoch verstehe ich die Speicherreservierung von Obijekten/Instanzen nicht so ganz.

Am besten zeige ich es an einem Beispiel:

// CKlasse ist eine Klasse und hat eine memberfunktion namens "anzahl()"

c++
___
Code:
int aktuelleanzahl = 0;

CKlasse *Klassenvariable = NULL;

Klassenvariable = new CKlasse // der Klassenvariable wird eine (referenz?) adresse zugewiesen.

aktuelleanzahl = Klassenvariable.anzahl(); // Wieso braucht man hier kein "*"? Ich dachte das man sonst nur auf die speicherdresse(?) zugreifen kann.

delete aktuelleanzahl;

  // Beispiel aus einem anderen Tuturial
/* 
int *zahl = Null;

zahl = new int;

*zahl = 100; //! hier braucht man den "*" wieder. warum hier schon aber bei "aktuelleanzahl = Klassenvariable.anzahl();" nicht?

delete zahl;
*/
Wie kann man dies am besten mit Delphi vergleichen?
Delphi:
Delphi-Quellcode:
var
anzahl: integer;
Klassenvariablenname: TKlasse;
begin
    Klassenvariablenname := TKlasse.Create()
    anzahl := Klassenvariablenname.anzahl;
    anzahl.free;
end;
- Bitte beantwortet mir meine zwischenfragen die ich neben den quellcode als kommentar geschrieben habe.

- Bitte beantwortet mir diese Frage: Welche Zeilen von Delphi wären die gleichen wie in c++? z. B:
("Klassenvariablenname := TKlasse.Create()" in delphi ist das gleiche wie "CKlasse *Klassenvariable = NULL;")

- Bitte beantwortet mir diese Frage: Welche Zeilen von c++ wären die gleichen wie in delphi? z. B:
"CKlasse *Klassenvariable = NULL;" in delphi ist das gleiche wie ("Klassenvariablenname := TKlasse.Create()")

Bitte fragt nach wenn ihr nicht genau verstanden habt was ich eigentlich will (habe es ein bisschen kompliziert ausgedrückt)

Danke für eure mühen.

Lg Simon

Geändert von Bladefire (28. Jul 2014 um 07:44 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

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

  Alt 28. Jul 2014, 07:01
Es wäre herzallerliebst, wenn du Quelltext auch in Code-Tags/Delphi-Tags setzen würdest.

Und via Google findet man z.B. das hier
http://de.m.wikibooks.org/wiki/C++-P...emente/_Zeiger
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Bladefire

Registriert seit: 30. Jun 2014
67 Beiträge
 
#3

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

  Alt 28. Jul 2014, 07:49
Danke für deine schnelle antwort.

Leider löst der link mein problem nicht. Bis jetzt konnte ich alles in c++ mit delphi vergleichen. Nun würde ich gerne wissen wie man den jeweiligen Quellcode den ich oben angegeben habe, in der jeweils anderen sprache schreibt.

Lg Simon
  Mit Zitat antworten Zitat
Mikkey

Registriert seit: 5. Aug 2013
265 Beiträge
 
#4

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

  Alt 28. Jul 2014, 07:59
Du solltest die Begriffe Referenz und Zeiger nicht durcheinanderbringen.

Zitat:
Wieso braucht man hier kein "*"?
Man braucht es! Wenn irgendein schrottiger Compiler den Zugriff ohne erlaubt, dann solltest Du das als Fehler betrachten. ein Zeiger ist ein Zeiger und muss auch so benutzt werden.

Normalerweise verwendet man in C++ aber statt "*" und "." "->", dann wird auch besser deutlich, was man da tut.

Code:
pKlassenvariable->anzahl();
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

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

  Alt 28. Jul 2014, 08:11
Hier mal dein C++ Code in Delphi gefasst
Delphi-Quellcode:
program dp_181230;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils;

type
  CKlasse = class
  public
    function anzahl : Integer;
  end;

  { CKlasse }

function CKlasse.anzahl : Integer;
begin
  Result := 42;
end;

procedure Foo;
var
  aktuelleanzahl : Integer; // eine einfache Variable
  Klassenvariable : CKlasse; // eine Klassen-Referenz-Variable
  zahl : PInteger; // Ein Zeiger auf einen Integer
begin
  // int aktuelleanzahl = 0;
  aktuelleanzahl := 0;
  // CKlasse *Klassenvariable = NULL;
  Klassenvariable := nil;
  // Klassenvariable = new CKlasse
  Klassenvariable := CKlasse.Create;
  // aktuelleanzahl = Klassenvariable.anzahl();
  aktuelleanzahl := Klassenvariable.anzahl( );
  // delete aktuelleanzahl;
  // DELPHI: Variablen kann man überschreiben, aber der Speicher sollte nicht freigebeben werden

  Klassenvariable.Free; // In Delphi notwendig, sonst Speicherleck

  // int *zahl = Null;
  zahl := nil;
  // zahl = new int;
  new( zahl );
  // *zahl = 100;
  zahl^ := 100;
  // delete zahl;
  FreeMem( zahl );
end;

begin
  ReportMemoryLeaksOnShutdown := True;
  try
    Foo;
  except
    on E : Exception do
      Writeln( E.ClassName, ': ', E.Message );
  end;

end.
In Delphi erfolgt die Dereferenzierung bei Klassen-Referenz-Variablen automatisch, daher ist dort keine explizite Behandlung notwendig.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (28. Jul 2014 um 08:14 Uhr)
  Mit Zitat antworten Zitat
Bladefire

Registriert seit: 30. Jun 2014
67 Beiträge
 
#6

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

  Alt 28. Jul 2014, 10:21
@ Mikkey, ich benute MS visual studio 2013. Möglicherweise habe ich ein falsches beispiel genannt wann man ihn nicht braucht.

Möglicherweise ist hier die verwendung korrekt (wenn ja, warum?):

Code:
#include <iostream>

using namespace std;

class CSpieler
{
private:
   char m_Name[30];
   int m_status;

public:

   void init();
   void zeigedaten();

};

void CSpieler::init()
{
   cout << "Bitte Namen eingeben:" << endl;
   cin.ignore();
   cin.get(m_Name, 29);
   m_status = 10;


}

void CSpieler::zeigedaten()
{
   cout << "Name: " << m_Name << endl;
   cout << "Status: " << m_status << endl;
   cout << endl;


}

int main()
{
   CSpieler *pSpielerliste = NULL;

   int anzahl;

   cout << "Wie viele Spieler?" << endl;
   cin >> anzahl;

   pSpielerliste = new CSpieler[anzahl];

   for (int i = 0; i < anzahl; i++)
   {
      cout << "Spieler " << i + 1 << endl;
      pSpielerliste[i].init();
      cout << endl;
   }

   for (int j = 0; j < anzahl; j++)
   {
      cout << "Spieler: " << j + 1 << endl;
      pSpielerliste[j].zeigedaten();
      cout << endl;
   }

   delete[] pSpielerliste;

}
@ Sir Rufo, herzlichen danke das wollte ich wissen

lg Simon
  Mit Zitat antworten Zitat
Benutzerbild von JamesTKirk
JamesTKirk

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

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
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

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

  Alt 31. Jul 2014, 07:51
Mix doch bitte nicht New und FreeMem !
Musst mich ja nicht gleich so anschreien - hast ja recht, und ich habe es in meinem Code auch geändert, merci
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von JamesTKirk
JamesTKirk

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

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

  Alt 1. Aug 2014, 06:38
Mix doch bitte nicht New und FreeMem !
Musst mich ja nicht gleich so anschreien
Sorry. Dabei hab ich doch extra klein und mit Bitte geschrieben, damit's nicht so laut wirkt
- hast ja recht, und ich habe es in meinem Code auch geändert, merci
Danke

Code:
  (* hier wundere ich mich gerade, dass dein C++ Compiler sich nicht
   * darüber beschwert, dass es Klassenvariable->anzahl() heißen
   * muss... :/
   *)
Es mag C++-Compiler geben, die (ähnlich wie Delphi beim '@' in Methodenparametern) das Sternchen generös einfügen.
Und solche Automatismen führen dann dazu, dass Anfänger nicht verstehen, was genau nun vor sich geht...

Im Gegensatz zu C# hat Delphi dafür ein Pendant: object
Und (abgesehen davon, dass 'object' als veraltet gekennzeichnet wird) wie stellst Du dann echte Referenzvariablen dar:

Code:
{
  CKlasse obj(..);
  CKlasse* ptrObj = new CKlasse(..);
  CKlasse& refObj = *ptrObj;
}
?
Dass object in Delphi als veraltet gilt stört mich ehrlich gesagt überhaupt nicht. Ich bin FPC Entwickler und dort ist object nach wie vor first-class Citizen (und wird zum Beispiel im Compiler selbst noch hier und da verwendet).
Referenzvariablen lassen sich in der Tat nicht mit Delphi darstellen (außer als Parameter, wo du var und in FPC constref verwenden kannst). Andererseits sind Referenzvariablen nicht auf Klassen beschränkt und hier geht es ja um die Speicherverwaltung um Klassen und deren Äquivalenzen in Delphi. Und da ist nun mal object das was am nähesten rankommt...

Delphi-Quellcode:
procedure Test2;
var
  myCar : TAuto;
begin
  myCar := TAuto.Create( 'BMW' );
  Writeln( SizeOf( myCar ) ); // -> 100
end;
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).
Da TAuto ein Record ist, liegt es auf dem Stack. Bei TAuto.Create wird (grob gesagt) auf einer temporären Variable vom Typ TAuto auf dem Stack gearbeitet, die an Create als versteckter Parameter übergeben wird und anschließend an myCar zugewiesen wird. Ein Record ist nur dann auf dem Heap, wenn du mit New oder GetMem und ner Zeigervariablen (type PAuto = ^TAuto; ) arbeitest.

In meinem Delphi hat ein Record keinen Konstruktor und auch keine Klassenfunktionen, die so tun könnten als ob.
Ab Delphi 2006 (glaub ich) und Free Pascal 2.6.0 (für (Klassen)Methoden) bzw. 2.7.1 (für Konstruktoren) funktioniert das.

Gruß,
Sven
Sven
[Free Pascal Compiler Entwickler]
this post is printed on 100% recycled electrons
  Mit Zitat antworten Zitat
Mikkey

Registriert seit: 5. Aug 2013
265 Beiträge
 
#10

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

  Alt 31. Jul 2014, 08:39
Code:
  (* hier wundere ich mich gerade, dass dein C++ Compiler sich nicht
   * darüber beschwert, dass es Klassenvariable->anzahl() heißen
   * muss... :/
   *)
Es mag C++-Compiler geben, die (ähnlich wie Delphi beim '@' in Methodenparametern) das Sternchen generös einfügen.

Im Gegensatz zu C# hat Delphi dafür ein Pendant: object
Und (abgesehen davon, dass 'object' als veraltet gekennzeichnet wird) wie stellst Du dann echte Referenzvariablen dar:

Code:
{
  CKlasse obj(..);
  CKlasse* ptrObj = new CKlasse(..);
  CKlasse& refObj = *ptrObj;
}
?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 21:49 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