Gültigkeit von Zeigern überprüfen



  • hallo,

    ist es möglich die Gültigkeit von Zeigern zu überprüfen?
    also zu prüfen, ob der Zugriff auf das, worauf der Zeiger zeigt, zulässig ist?

    ist zum Beispiel wichtig, wenn ich Speicher mit delete wieder freigebe, aber den Zeiger nicht auf NULL setze.
    dann nützt mir ja die Überprüfung auf NULL auch nichts...

    mein Gedanke dazu war ja ein try-Block, in dem spaßenshalber ein Zugriff auf den Speicher stattfindet.
    wenn alles klappt, ist der Zeiger gültig, ansonsten eben nicht.

    Jetzt hab ich aber die Frage: wird da überhaupt eine Exception geworfen, oder wird das Programm direkt vom System beendet,
    wenn sowas passiert?
    Und wenn es funktioniert, würde es dann weitergehend auch unter C funktionieren?
    ich meine gehört zu haben, dass es unter C gar keine Exceptions gibt.

    Gibt es evtl noch eine andere Möglichkeit der Überprüfung?

    schonmal thx im voraus

    MfG DrakoXP



  • DrakoXP schrieb:

    Jetzt hab ich aber die Frage: wird da überhaupt eine Exception geworfen, oder wird das Programm direkt vom System beendet,
    wenn sowas passiert?

    Das ist schlicht und einfach undefiniert. Aber dass du eine C++ - Exception bekommst ist extrem unwarscheinlich 😉

    Und wenn es funktioniert, würde es dann weitergehend auch unter C funktionieren?
    ich meine gehört zu haben, dass es unter C gar keine Exceptions gibt.

    Exceptions gibt's so nur in C++

    Gibt es evtl noch eine andere Möglichkeit der Überprüfung?

    std::auto_ptr<>
    std::tr1::shared_ptr<>
    std::tr1::weak_ptr<>


  • Mod

    Der Wert eines Zeigerobjekts verweist entweder auf ein Objekt, ist ein Nullzeiger oder ist singulär (== verweist nicht auf ein Objekt oder ist Null). Der Zugriff auf den Wert eines singlären Zeigers ist undefiniert. Undefiniert bedeutet gerade, dass es keine (durch C++ definierte) Möglichkeit gibt, diesen etwas mit diesem Wert anzufangen. Das schließt dann logischerweise die Überprüfung auf Gültigkeit (was eigentlich schon in sich widersprüchlich ist) ein, denn das Werfen einer Exception (das kommt im Übrigen noch aus anderen Gründen nicht in Frage) ist alles andere als etwas, mit dem man nichts anfangen kann.
    Es wird auch gerne übersehen, dass dieses Undefiniert-Sein nicht nur eine Einschränkung hinsichtlich der Verwendung von Zeigern darstellt (es geht gerade nicht - oder nicht nur - um irgendwelche exotischen Systeme, die vielleicht wegen Traps aussteigen), vielmehr ist das auch eine Voraussetzung für viele Formen der Optimierung. z.B. (sinnfrei):

    void foo();
    int bar()
    {
        int x = 42;
        foo();
        return x;
    }
    int main()
    {
        cout << bar();
    }
    

    x ist hier eine lokale Variable, die nie Aliase hat, daher muss dieses Programm stets 42 ausgeben. Das wäre nicht gegeben, wenn foo auf irgendwelche undefinierte Weise (es gibt mit Sicherheit keine wohldefinierte Möglichkeit) per wilder Zeigermanipulationen auf x zugreifen würde (nat. kann die Plattform zusätzliche Möglichkeiten bieten, in denen dieses konkrete Beispiel versagen würde).


Anmelden zum Antworten