Verhindern, dass die Lebensdauer vorübergehend verlängert wird?

8
Das ist vielleicht unmöglich, aber ich habe mich gefragt, ob es möglich ist, ein vorübergehendes Ding von seinem ursprünglichen Ausdruck zu halten. Ich habe eine Kette von Objekten, die auf Elternobjekte zeigen, und eine Memberfunktion, die ein Kindobjekt erzeugt, ein vereinfachtes Beispiel ist hier

%Vor%

Ich möchte person verwenden, um es an eine Funktion zu übergeben, und zwar in etwa so:

%Vor%

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.

    
zounds 27.09.2011, 20:11
quelle

2 Antworten

3

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%     
m-sharp 27.09.2011, 20:23
quelle
0

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 ...

    
James Johnston 27.09.2011 20:29
quelle