Pointer Verwurf feststellen ...



  • Hi,

    mal wieder eine Zeigerfrage ....
    ich habe einen Integer a
    dann mache ich einen Pointer auf a
    und weil ich jetzt ganz lustig bin, mache ich einen Pointer auf den Pointer.

    Jetzt delete ich pointer auf a (nicht den pointer auf den pointer).

    jetzt natürlich landet mein pointer auf den pointer im Nirvana.

    Das Ganze geht auch so:

    Definition globaler Pointer b.

    Unterfunktion mit Integer a und die Adresszuweisung des globalen pointers b auf a.
    Dann ist die Unterfunktion zuende und mein Pointer hängt in der Luft ...

    Wie frage ich jetzt ab, ob ein Pointer noch gültig ist ?



  • Meiner meinung nach garnicht! Er ist ja in dem Sinne net ungültig, zeigt ja immer auf ein Stück speicher...



  • aber er greift doch auf eigentlich illegalen Speicher zu ??



  • OK, bin kein experte! Aber sieh dich doch mal nach smart pointern um! Vielleicht helfen die weiter...



  • ness schrieb:

    OK, bin kein experte! Aber sieh dich doch mal nach smart pointern um! Vielleicht helfen die weiter...

    Die lösen die Ursache aber leider nicht das resultierende Problem.

    MfG SideWinder



  • Wo ist der Bezug zur WinAPI.

    Weg damit.... ➡ ➡ ➡ ➡ ➡



  • Ja, ich kann dir jetzt genau erklären warum das so ist:

    Ich übergebe einen Pointer auf ein Interface über eine DLL an ein
    zweites Programm. Leider kann ich das zweite Programm schliessen
    und mein Pointer auf das Interface wird beim Aufruf ein kleines
    Problem.

    Soviel zur API ...



  • Ja, die WinAPI bietet Funktionen, die dir zurückliefern, ob ein bestimmter Pointer gültig ist.

    Doch zuerst ein paar Überlegungen, warum du diese Funktion besser nicht verwenden solltest:
    a) "Gültig" im Sinne von "vom Prozess ohne access violation lesbar/schreibbar". Nachteil: Ein wilder Pointer, der durch die Freigabe von Speicher entstanden ist, ist in diesem Sinne häufig noch gültig.
    b) Design: Besser als unten genannte Funktion ist ein Flag, das die Gültigkeit des Pointers angibt. Du wirst eh nicht um Synchronisation herumkommen, denn:
    c) Du hast immer noch ein Problem, das du nicht beachtet (erwähnt) hast: Was soll dein Programm machen, wenn Programm B geschlossen wird, _während_ Programm A mitten in einem Zugriff auf den Pointer ist?

    Die Funktionen heißen IsBadReadPtr/IsBadWritePtr. Bedenke aber bitte die genannten Punkte.



  • Ja, du hattest recht, die zwei Befehle bleiben leider auf gültig.

    andere Frage, gleiches Thema.

    das Interface, auf das der Pointer zeigt hat eine Funktion namens
    queryInterface mit Rückgabe _noInterface.
    Wie kann das gehen ?

    Ich stelle mir das so vor:
    Der Pointer hat einen Interfacenamen vorweg und ist somit mit
    dem Interfacecode verknüpft. Will sagen, der Code vom Interface bleibt
    solange erhalten, bis der Pointer deletet wird.
    Der Pointer wiederum zeigt nur auf den Datenbereich des Interfaces ?!?
    Dadurch kann nach Verwurf des Interfaces trotzdem der Pointer mit
    queryInterface aufgerufen werden und eine Rückgabe gegeben werden, das das
    Interface nicht mehr existiert, weil es released wurde.

    Übrigens: Wie ist das mit dem "loslassen" ?
    gibt es in der API einen Standartdestruktor, der die Release Funktion
    eines Interfaces beim Verlassen des Programmes automatisch ausführt ?
    Oder wird alles einfach liegengelassen ?



  • Wenn du dir mit new Speicher allokierst, dann kannst du den Pointer ohne Probleme nach Verlassen der Funktion weiterverwenden (bis du den Speicher mit delete wieder freigibst).


Anmelden zum Antworten