C++ - Objektreferenzen und wenn ihr Objekt geloescht wird



  • Ich würde ganz gerne in einer Liste Referenzen auf Objekte verwalten. Dabei stellt sich mir aber das Problem, was passiert wenn ein solches Objekt geloescht wurde.

    Dazu habe ich untenstehenden Code erstellt. Kann mir vielleicht jemand genauer erläutern, was dort intern passiert?

    Und warum bekomme ich in den Zeilen 25 und 26 keine Speicherzugriffsfehler oder ähnliches?

    Compiliert habe ich mit "g++ test.cpp -o tst -Wall", falls das irgendwie von Bedeutung sein sollte. Fehler oder Warnungen hat mir das nicht gebracht.

    #include <iostream>
    using namespace std;
    
    class A
    {
    public: int a;
            A()
            {
                    a = 3;
            }
    };
    
    int main(int argc, char** argv)
    {
            A *a; 
            a = new A();
            a->a = 10; 
    
            A &b = *a; 
            cout << b.a << endl;    //10
    
            delete a;
            cout << b.a << endl;    //0 
    
            b.a = 15; 
            cout << b.a << endl;    //15
    
            A *c = new A();
            cout << c->a << "  " << b.a << endl;    //3  3
    
            return 0;
    };
    


  • Das Verhalten beim Verwenden einer Referenz auf ein gelöschtes Objekt ist undefiniert, also was spielt es für eine Rolle, welche Zahlen dabei rauskommen?



  • Und warum bekomme ich in den Zeilen 25 und 26 keine Speicherzugriffsfehler oder ähnliches?

    Weil das einfach undefined behaviour ist. Da kann irgendwas passieren.
    Auch Zeile 23 ist undef. beh.
    Und Zeile 29 b.a auch.

    Simon



  • Hi knuddelvieh,

    vielleicht nur ein Hinweis zum Sprachgebrauch: Unter "Referenz" versteht man in C++ meistens keinen Zeiger (auch wenn beides im Sinne von "Verweis" auch eine "Referenz" ist). Du minderst das Missverständnisrisiko, wenn Du diese konvention beachtest....

    Gruß,

    Simon2.



  • TyRoXx schrieb:

    Das Verhalten beim Verwenden einer Referenz auf ein gelöschtes Objekt ist undefiniert, also was spielt es für eine Rolle, welche Zahlen dabei rauskommen?

    Ahh, danke!
    Es war mir unklar, dass das nicht standardisiert ist. 🙂

    Simon2 schrieb:

    Hi knuddelvieh,

    vielleicht nur ein Hinweis zum Sprachgebrauch: Unter "Referenz" versteht man in C++ meistens keinen Zeiger (auch wenn beides im Sinne von "Verweis" auch eine "Referenz" ist). Du minderst das Missverständnisrisiko, wenn Du diese konvention beachtest....

    Gruß,

    Simon2.

    Das eine Referenz kein Pointer ist, ist mir klar. Bloß interessehalber, an welche Stelle hab ich da was verwechselt? (Ich hatte wirklich überlegt Referenzen zu verwalten und keine Pointer, ob das geht weiß ich aber selbst noch nicht. :-D)



  • Diese Aussage geht in C++ nicht:

    Ich würde ganz gerne in einer Liste Referenzen auf Objekte verwalten.

    Da Referenzen lediglich Alternativnamen sind brauchen sie auch keinen/nicht unbedingt einen Speicherplatz. Und somit können auch keine Listen damit verwaltet werden, was mit Zeiger möglich ist.



  • Ahh gut, meine Idee war bloß, dass ich Referenzen verwalte, da ich dachte da ist eventuell auch ein Referenzcounter dabei.

    Aber dann muss ich es eben doch mit Pointern machen.

    Danke euch allen für die Hinweise. 🙂



  • Hehe. Nette Idee, aber das ist gar nicht nötig, weil eine Referenz _immer_ gültig ist, respektive auf ein Objekt verweist. (Es gibt Möglichkeiten eine Referenz ungültig zu machen, was aber kein legales C++ mehr ist).

    Aber du könntest einen Smart Pointer benutzen, oder auch einen Pointer Container von boost:

    Smnart Pointer:
    http://www.boost.org/doc/libs/1_39_0/libs/smart_ptr/smart_ptr.htm

    Pointer Container:
    http://www.boost.org/doc/libs/1_39_0/libs/ptr_container/doc/ptr_container.html



  • knuddelvieh schrieb:

    Ahh gut, meine Idee war bloß, dass ich Referenzen verwalte, da ich dachte da ist eventuell auch ein Referenzcounter dabei.

    Nein, C++ bietet für die einfachen Typen eigentlich kaum solche Funktionalität an (zumindest nicht direkt als Sprachfeature). Aber das kann man leicht nachbauen. 😉

    Wenn du geteilten Besitz (mehrere Zeiger zeigen auf das gleiche Objekt, der letzte soll es richtig freigeben) brauchst, ist boost::shared_ptr genau das Richtige für dich. Mehr findest du unter drakons Link.



  • knuddelvieh schrieb:

    ...Bloß interessehalber, an welche Stelle hab ich da was verwechselt?...

    Nunja - Du sagst "Referenzen" - in Deinem Code tauchen aber nur "Zeiger" auf, so dass ich davon ausgegangen bin, dass Dir der Unterschied nicht ganz bewusst ist.
    Aber auch egal.

    Gruß,

    Simon2.


Anmelden zum Antworten