pointer, Zugrif auf Strukturelemente, Überleben nach Funktionsaufruf
-
Hi,
ich habe folgendes Problem:
Ich habe eine Struktur als Klasse angelegt.
Nun möchte ich von dieser Klasse Objekte anlegen, mit zeigern darauf verweisen, diese an eine andere Funktion uebergeben und mit Werten fuellen.
Zunächst habe ich ein Objekt angelegt mitklasse_strukt objekt;
Anschließend einen Zeiger mit
klasse_strukt* zeiger = new klasse_strukt;
und den zeiger auf das Objekt zeigen lassen mit
zeiger = &objekt;
Nun habe ich gelesen, dass man mit
*zeiger auf das Objekt zugreifen könne.
Ich bekomme jedoch eine Fehlermeldung wenn ich mit
*zeiger.feld_des_objekts;
ein feld füllen möchte. Wie kann man denn da richtig daraufzugreifen?
Wie erstelle ich eigentlich Objekte, die auch nach meinem Funktionsaufruf noch vorhanden sind? Mit new kam ich da nicht weiter.
Und noch eine allgemeine Frage. Wie kann ich hier im Forum den Quelltext hervorheben?
Danke
-
du hast ein Speicherleck, weil du zweimal Speicher für ein Objekt allozierst, einmal auf dem heap durch new, einmal auf dem Stack, den Zeiger umlenkst, aber vorher das Objekt auf dem Heap nicht deallozierst.
syntax wäre:
(*deinobjekt).machwas()
oder
deinObjekt ->machwas()
-
Ich weiß nicht, ob ichs richtig verstanden habe, aber ich probiere es mal.
Aber so ganz kapiere ich nicht, warum ich zweimal speicher alloziere. Ich lege doch mit new einen zeiger auf ein Objekt an, aber noch kein Objekt an sich, oder?
mitklasse_strukt objekt;
lege ich dann ein Objekt an, das meine Daten aufnhemen kann. Richtig?
Und Du meinst, mit(*zeiger).feld_des_objekts("gewünschter_Feldinhalt");
oder so ähnlich kann ich das dann Datenfeld des Objekts dann belegen?
-
micha55555 schrieb:
Ich weiß nicht, ob ichs richtig verstanden habe, aber ich probiere es mal.
Aber so ganz kapiere ich nicht, warum ich zweimal speicher alloziere. Ich lege doch mit new einen zeiger auf ein Objekt an, aber noch kein Objekt an sich, oder?
mitklasse_strukt objekt;
lege ich dann ein Objekt an, das meine Daten aufnhemen kann. Richtig?
Und Du meinst, mit(*zeiger).feld_des_objekts("gewünschter_Feldinhalt");
oder so ähnlich kann ich das dann Datenfeld des Objekts dann belegen?
Hallo,
mit
klasse_strukt objekt; // Wobei ich den Bezeichner der Klasse unpassend finde.
erstellst du ein Objekt einer Klasse (ein Strukt ist im Prinzip auch eine Klasse) auf dem Stack. Dieses besitzt somit auch eine Adresse, auf welche über den &-Operator zugegriffen werden kann.
mit
klasse_strukt* zeiger = new klasse_strukt;
reservierst du auf dem Heap per new Speicher für den Typ 'klasse_strukt'. Die Adresse an welcher Speicher für dieses Objekt reserviert wurde, wird in 'zeiger' gespeichert.
Merke: Jeder per new reservierte Speicher muss mit delete wieder freigegeben werden (ansonsten Speicherleck). Und merke auch: Du kommst von nun an _nur_ über den Zeiger 'zeiger' an den reservierten Speicher heran.
In der Zeile
zeiger = &objekt; // autsch.
lässt du 'zeiger' aber auf das zuvor lokal erstellte Objekt 'objekt' zeigen. Konkret heißt das, dass der Zeiger 'zeiger' von nun an die Adresse des Objekts 'objekt' enthält und _nicht_ mehr die Adresse an der du den Speicher reserviert hast => Der Speicher den du zuvor reserviert hast ist unweigerlich verloren und nur das Betriebsystem kann ihn noch freigeben...
Caipi
-
Und merke auch: Du kommst von nun an _nur_ über den Zeiger 'zeiger' an den reservierten Speicher heran.
Außer, man nimmt einen weiteren Zeiger, und setzt ihn mit 'zeiger' gleich, dann kann man mit mehreren Zeigern auf den selben reservierten Speicher zugreifen, schließlich zeigen Sie auf die gleiche Adresse im Speicher, oder?
-
schorf2k schrieb:
Und merke auch: Du kommst von nun an _nur_ über den Zeiger 'zeiger' an den reservierten Speicher heran.
Außer, man nimmt einen weiteren Zeiger, und setzt ihn mit 'zeiger' gleich, dann kann man mit mehreren Zeigern auf den selben reservierten Speicher zugreifen, schließlich zeigen Sie auf die gleiche Adresse im Speicher, oder?
Jup. Da hast du recht.
Caipi