Großes Problem mit Klassen



  • Hallo.

    Ich habe ein Problem, wo ich nicht mehr weiter weiß.

    Ich habe eine Klasse mit dem Hauptfenster.

    class CMainDlg
    {
    public:
        CMainDlg(void);
    
        CConfig * config;
    }
    

    In dieser Klasse ist ein Pointer auf eine andere Klasse, CConfig. Im Konstruktor der Fensterklasse (CMainDlg) wird config auf new CConfig() gesetzt.

    Soweit funzt das auch noch.

    Aber wenn ich dann in der CMainDlg eine andere Klasse mit new aufmache, ist die config-Variable irgendwie zerstört. <Schlechter Ptr>.

    Kann ich die Config-Klasse auch ohne einen Pointer als Membervariable in der Fensterklasse instanzieren?

    Danke.



  • Bist du sicher, dass der Zeiger, den du dort hast gültig ist?

    Wär vlt. noch hilfreich den Konstruktor zu sehen.



  • Das Problem ist nicht der Constructor.

    MainDlg::MainDlg(void)
    {
        config = new Config();
    }
    

    Sondern das Ding da:

    // nur so, ist aber mit im header dabei.
    Config * CSettingsDlg::config;
    
    CSettingsDlg::CSettingsDlg(Config * c)
    {
        config = c;
    }
    

    Der SettingsDlg will die Klasse ja auch. Das ist ja der Einstellungen-Dialog, der soll da was verändern. Ich habe mal einen BreakPoint gesetzt. Die Variable c ist noch ok, config aber nicht.

    hoffentlich könnt ihr mir helfen.



  • Ist CSettingsDlg von CMainDlg abgeleitet?



  • bein.

    Beide klassen sind völlig für sich. das ist auch kein mfc (CWnd) oder so. alles reine WinAPI. aber das tut nix zur sache. Config auch nicht abgeleitet, alle Klassen sind so für sich.



  • Mit dem bisher gesehenen Code kann man nur ins Blaue raten. Mein Verdacht ist der, das bereits das Objekt auf das der Zeiger zeigt destruiert wurde.

    Was ich mir vorstellen könnte ist, vereinfacht gesprochen, ein solcher Fall:

    class A {};
    class B
    {
      private:
        A* a;
    
      public:
        B()
        : a(new A())
        {}
    
        ~B()
        {
          delete a;
        }
    };
    
    void foo(B b) {}
    
    int main()
    {
      B b;
      foo(b);
    } // <-- Hier knallt es da der Zeiger zum zweiten mal gelöscht wurde
    

    Bei der Fehlerbeschreibung gehe ich von der Übergabe als Wert (Copy-By-Value) aus. Im oberen fall wird bei dem Aufruf von foo ein neues Objekt generiert (Mittels Kopierkonstruktors) und am Ende von foo der Destruktor für dieses Objekt aufgerufen... Da der Zeiger 1:1 kopiert wurde wird demzufolge zweimal delete auf den Zeiger aufgerufen.

    cu André


Log in to reply