Ich möchte person
verwenden, um es an eine Funktion zu übergeben, und zwar in etwa so:
Ist in Ordnung.
Das funktioniert gut, solange kein Provisorium den ursprünglichen Ausdruck überlebt, aber wenn ich eines der letzten Provisorien an eine const-Referenz binde, überleben seine Eltern nicht, und ich bekomme einen segfault. Ich kann den Kopierkonstruktor und den Zuweisungsoperator von person
ausblenden, aber gibt es irgendeine Möglichkeit, wie ich diese Art von Fehler verhindern kann? Ich möchte, wenn möglich, eine dynamische Zuordnung vermeiden.
Es sieht so aus, als ob Sie hier eine Datenstruktur erstellen, in der Kinder Zeiger auf ihre Eltern haben. Die Verwendung von Provisorien wird Ihnen in diesem Fall garantiert Kummer bereiten. Um dies sicher zu machen, müssen Sie eine Art von Referenzzählung dynamisch zuordnen und möglicherweise verwenden.
Haben Sie darüber nachgedacht, boost::shared_ptr
zu verwenden? Es ist eine Implementierung einer Referenzzähler Smart-Pointer-Klasse. Mit shared_ptr
und einigen Factory-Methoden können Sie möglicherweise den gewünschten Effekt erzielen und den Aufwand für die dynamische Speicherzuweisung verringern. Ich habe es ausprobiert und es scheint zu funktionieren. Sobald der Code den Bereich verlässt, werden alle Objekte gelöscht, da keine Referenzen mehr auf die shared_ptrs vorhanden sind.
Bearbeiten: Als Antwort auf den Kommentar von zounds habe ich das Beispiel so geändert, dass das Stammobjekt die Lebensdauer der Datenstruktur steuert.
%Vor%Sie müssen so etwas tun:
%Vor%Auf diese Weise geht das übergeordnete "a" nicht aus dem Geltungsbereich, bis Sie wirklich damit fertig sind (nach dem Aufruf von "verwenden").
Das Problem mit dem ursprünglichen Code ist, dass der Elternteil "Anna" nur lange genug herumstehen muss, um "Baby" anzurufen, und der Elternteil kann vor dem Funktionsaufruf verworfen werden. Indem Sie das übergeordnete Element zu einer Variablen mit Gültigkeitsbereich machen, können Sie steuern, wann es zerstört wird.
Sieht das für mich gefährlich aus? Ja. Daher schlage ich einen Blick auf die Antwort von m-sharp auf die dynamische Zuweisung. Aber wenn Sie eine Methode wünschen, die keine Referenzzählung benötigt, usw. können Sie dies auf diese Weise tun ...
Tags und Links c++ reference object-lifetime const-reference temporaries