Konstante Refernezen auf temproäre Objekte



  • Hallo.

    Ich las, dass konstante Referenzen, die mit temporaeren Objekten initialisiert werden voellig in Ordnung sind.

    Allerdings habe ich ein Problem mit dem GNU C++ Compiler (Version 2.95-4, 3.0, 3.2.3 und 3.3), das offenbar durch die Verwendung eines temporaeren Objekts mit einer Referenz entsteht:

    class A
    {
    string const &m_str;

    public:
    A(string const &str)
    : m_str(str) {
    }

    // Elementfunktionen, die auf m_str zugreifen.
    }

    string f()
    {
    string s = "foo";
    return s;
    }

    string g()
    {
    A a(f());

    // Hier sollte eine Elementfunktion von A auf m_str zugreifen. m_str scheint aber bereits zerstoert worden zu sein.
    }

    Es scheint, als wuerde m_str direkt nach der Konstruktion auf etwas Ungueltiges "verweisen".

    Wo ist der Haken?
    Danke.



  • Hallo,
    das unbenannte Objekt, welches von f() geliefert wird, wird an die Referenz str gebunden. Damit bestimmt *diese* Referenz die Lebensdauer des Objekts. Das Objekt lebt solange, wie *diese* Referenz. Also bis zur schließenden Klammer des Ctors.

    Da du nun aber m_str ebenfalls das erwähnte Objekt referenzieren lässt, hast du ein Problem. Das Objekt stirbt mit Ablauf des Konstruktors. Die Referenz m_str existiert aber viel länger. Sie referenziert nun aber ein nicht mehr existierendes Objekt. Du hast also eine "dangling reference" erzeugt.


Anmelden zum Antworten