Problem mit OpenGl/Glut Destruktor



  • Hallo,

    Ich habe ein Problem mit einer OpenGl/Glut Anwendung. Ich habe eine Klasse "glutwindow" in der alle Glutfunktionen definiert werden. Desweiteren habe ich nun meine zentrale Klasse "render" die von "glutwindow abgeleitet ist und mein ganzes rendern übernimmt. Diese hat natürlich einen Destruktor, dessen Code aber bei beenden des Programms ignoriert wird.

    class glutWindow {
    .
    .
    .
    }
    
    class render: public glutWindow {
    .
    .
    .
    }
    
    ~render()  <-- wird nie ausgeführt!!!
    

    Ich öffne zur Laufzeit aus "render" heraus zwei externe Anwendungen über die Shell und wollte die beiden im Destruktor von "render" auch gerne wieder schließen, aber der Code wird wie gesagt gar nicht ausgeführt.

    Kann mir jemand erklären warum oder wie ich das Ausführen des Destruktors "~render()" erzwingen kann?

    Wäre für jeden Tip zur Erhellung dankbar



  • Patrice079 schrieb:

    Diese hat natürlich einen Destruktor, dessen Code aber bei beenden des Programms ignoriert wird.

    das program macht was du ihm sagst.

    Kann mir jemand erklären warum oder wie ich das Ausführen des Destruktors "~render()" erzwingen kann?

    delete das render objekt.



  • Dieser Thread wurde von Moderator/in rapso aus dem Forum Spiele-/Grafikprogrammierung in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Mahgels Code und funktionierender Glaskugeln rate ich mal:

    1. Du hast ein render-Objekt, auf das du über einen Pointer auf ein glutWindow zugreifst.
    2. du versuchst das Objekt per delete auf diesen Pointer zu zerstören.
    3. der Destruktor von glutWindow ist nicht virtuell deklariert.
    class glutWindow {
      /*...*/
    public:
      ~glutWindow() {} //nicht virtuell
    };
    
    class render: public glutWindow {
      /* ... */
    };
    
    int main()
    {
      glutWindow* pWindow = new render();
      /* ... */
      delete pWindow; //OUCH. Welcome to the dark shady realms of undefined behavior
    }
    

    Lösung (falls meine Vermutung stimmt): Nochmal im Buch deiner Wahl nachlesen was bei Laufzeitpolymorphie wirchtig ist.



  • Das Problem mit GLUT ist dass die glutMainLoop() nicht returned sondern exit() aufruft, deswegen würde ich auch davon abraten GLUT in C++ zu verwenden. Es gibt modernere Alternativen wie z.B. freeglut oder GLFW...


Anmelden zum Antworten