Unmanged Zeiger in Managed Klasse



  • Guten Abend

    irgendwie stehe ich gerade vor einem Rätsel.
    Ich habe folgenden Code:

    public ref class EditorForm : public System::Windows::Forms::Form {
    private:
    	Renderer* renderer;
    

    Renderer ist eine unmanaged C++ Klasse. Der Ctor von Renderer ist leer.

    Jetzt habe ich folgende 2 Funktionen:

    EditorForm(void) {
       InitializeComponent();	
       Application::Idle += gcnew EventHandler(this, &EditorForm::OnIdle);		
    }
    
    bool init() {
       renderer = new Renderer;	
       spCntVP1Vert->Panel2Collapsed = true;
      ...
    

    Wie man sieht ein simpler Ctor der Form und eine Methode, die renderer initialisiert und dann bei einem SplitPanel auf der Form ein Panel wegschaltet.

    Aufgerufen wird das ganze in Main so:

    EditorForm^ editorForm = gcnew EditorForm();
    bool initResult = editorForm->init();
    

    Der ganze Code funtioniert. Jetzt kommt das seltsame: Wenn ich lediglich die ersten 2 Zeilen in init() ändere, sprich in das hier:

    bool init() {	
       spCntVP1Vert->Panel2Collapsed = true;
       renderer = new Renderer;
      ...
    

    dann stürzt das Programm mit dieser Meldung ab:

    An unhandled exception of type 'System.AccessViolationException' occurred in test2.exe

    Additional information: Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist.

    Wie kann denn die Reihenfolge eine Rolle spielen??? Den Form Controls muss es doch völlig egal sein, ob ich meinen Renderer angelegt habe oder nicht? Weiß irgendwer wo da das Problem liegt? 😕



  • Guck doch bitte einfach mal wo genau diese Exception auftritt.
    Vermutlich in irgendeinem Event-Handler, der von spCntVP1Vert->Panel2Collapsed = true; getriggert wird, und versucht "renderer" zu verwenden.



  • hustbaer schrieb:

    Guck doch bitte einfach mal wo genau diese Exception auftritt.

    Öhm, blöde Frage: Wie genau mach ich das? Bei mir geht da einfach nur ein Fenster mit dieser Exception auf. Leider gibts keinen Button "Jump to position" oder so.



  • Geh mit dem Debugger im Einzelschrittmodus durch den Code (F11 müsste das sein).



  • Michael E. schrieb:

    Geh mit dem Debugger im Einzelschrittmodus durch den Code (F11 müsste das sein).

    Blödsinn.
    Einfach im Debugger laufen lassen und warten bis die Exception kommt.
    Ggf. musst man noch ein paar "debugging assistants" aufdrehen, aber normalerweise sollte er bei sowas gleich an der richtigen Stelle stehen.


Anmelden zum Antworten