Referenz auf den Heap
-
Hi,
ich frage mich, wie man es bewerkstelligen kann eine Referenz auf ein Objekt auf dem Heap zu bekommen?
MyObj &obj1 = MyObj(); MyObj *obj2 = new MyObj(); //MyObj &obj3 = new MyObj();Während es mit obj1 gut funktioniert, muß ich um ein Objekt obj2 im von new geholten Speicher zu adressieren einen Pointer benutzen. Wie bekomme ich eine Referenz auf ein Objekt obj3 im Heap hin?
Vielleicht denke ich auch gerade völlig verquer (bin krank
), dann bitte ich das zu entschuldigen
danke
-
new liefert dir einen Zeiger - wenn du eine Referenz willst, mußt du dazu das Objekt hinter dem Zeiger nehmen:
MyObj& ref = *(new MyObj());(btw - die Initialisierung von obj1 kommt zwar möglicherweise durch den Compiler, ist aber sicher keine gute Idee - das Objekt, das du Referenzierst, wird nämlich sofort wieder zerlegt, so daß du danach auf Daten zeigst, die dir nicht gehören (und die spätestens nach einigen weiteren Funktionsaufrufen keine Ähnlichkeit mit einem 'MyObj'-Objekt haben))
Aber normalerweise solltest du lieber Zeiger verwenden, um auf den Heap zuzugreifen (OK, das ist meine persönliche Meinung, aber das sieht zumindest übersichlicher aus).
-
Hi,
ergänzend zu CStoll:
Aufräumen nicht vergessen !!!MyObj* obj3Ptr = new MyObj(); MyObj &obj3 = *obj3Ptr; // Mach, was Du willst ... delete obj3Ptr;(oder noch besser mit scoped-Pointern)
Gruß,
Simon2.
-
Vielen Dank.
Wieso würdest Du eher Pointer verwenden? Ich dachte Referenzen sollen sicherer sein, da sie eben immer auf das Objekt zeigen und nicht durch Progammierfehler manipuliert werden können. Mir wurde vor kurzem gesagt, Pointer am Besten nur da verwenden, wo man sie wirklich braucht - sonst lieber Referenzen. Oder ist das nicht so eindeutig?
Simon2 schrieb:
oder noch besser mit scoped-Pointern
Wo liegt denn darin der Vorteil?
danke
-
Im Zusammenhang mit dem Heap sind Referenzen auch nicht besonders sicher (klar, du kannst sie nicht umbiegen - aber wenn du sie delete'st, hast du genauso undefinertes Verhalten).
scoped-Pointer sind da günstiger, vor allem weil du dich nicht mehr um die Aufräumarbeiten kümmern mußt (wenn du mehr dazu wissen willst, schau mal in unser Magazin).
-
_et schrieb:
Vielen Dank.
Wieso würdest Du eher Pointer verwenden? Ich dachte Referenzen sollen sicherer sein, da sie eben immer auf das Objekt zeigen und nicht durch Progammierfehler manipuliert werden können. Mir wurde vor kurzem gesagt, Pointer am Besten nur da verwenden, wo man sie wirklich braucht - sonst lieber Referenzen. Oder ist das nicht so eindeutig?
C++ Referenzobjekte "zeigen" aber nirgeds wo drauf. Zeigen tun nur Zeiger (Pointer)... wie der Name schon sagt. Merke dir eines (orig. von Stroustrup): "Referenzen sind nur ein anderer Name für ein Objekt."
Lass dir das mal durch den Kopf gehen, dann wirst du den Unterschied erkennen.

-
_et schrieb:
...
Simon2 schrieb:
oder noch besser mit scoped-Pointern
Wo liegt denn darin der Vorteil?
danke
Wie CStoll schon sagt: Mit scoped Pointern verringerst Du dramatisch die Chance von Speicherlecks (sprich: Du kannst nicht mehr vergessen, sie zu deletenm weil das der scoped-Pointer für Dich macht).
Trotzdem bleibt die Gefahr von verwaisten Referenzen...
Gruß,
Simon2.