Exception beim verlassen vom dtor



  • Hi

    Ich wurde darauf angesetzt den Grund für einen Absturz im Releas-Modus zu finden.

    Ich konnte es jetzt soweit eingrenzen:

    ~obj()
    {
     cout << "dtor start\n";
    
     //...
    
     cout << "dtor end\n";
    }
    
    //...
    
    cout << "before delete\n";
    
    delete pObj;
    
    cout << "after delete\n";
    

    Ausgabe:

    before delete
    dtor start
    dtor end
    Exception

    Der Quelltext steht unter Verschluss daher kann ich ihn hier nicht posten.

    Hatte vielleicht jemand bereits das selbe Problem und kann mir einen Tipp geben wonach ich suchen muss?

    mfg

    rean

    [EDIT]
    Alle beteiligten Klassen liegen übrigens in einer DLL.

    Außerdem werden die member wohl noch richtig abegräumt da das:

    struct test
    {
    ~test(){ cout << "test dtor"; }
    };
    
    class obj
    {
    //... ein ganzer haufen membervariablen
    
    test test1;
    }
    

    folgende Ausgabe produziert:

    before delete
    dtor start
    dtor end
    test dtor
    Exception



  • [Glaskugel-Modus]

    Es sieht aus, als wenn das Objekt, dessen Dtor Du da triggerst andere Objekte enthält, und von einem dieser Objekte scheint der Dtor eine Exception zu werfen.

    [Glaskugel-Modus]

    Beispiel:

    struct A
    {
        ~A(){throw 0;} //NIEMALS !!
    };
    
    struct B
    {
        ~B()
        {
            std::cout << "B Dtor begin\n";
    
            //hier wird aufgeraeumt...
    
            std::cout << "B Dtor end\n";
        }
    
        A a;
    };
    
    int main()
    {
        B* b = new B();
    
        std::cout << "Vor delete\n";
        delete b;
        std::cout << "Nach delete\n";
    
    }
    

    Ausgabe:
    Vor delete
    B Dtor begin
    B Dtor end

    This application has requested the Runtime to terminate it in an unusual way.
    Please contact the application's support team for more information.



  • ohne quelltext ist es mit hilfe bekommen schwierig, da man das problem nicht finden kann.



  • rean schrieb:

    Der Quelltext steht unter Verschluss daher kann ich ihn hier nicht posten.

    Das ist natürlich sehr hilfreich für eine Lösung des Problems. 🙄
    Kannst du nicht wenigstens eine Entsprechung aufschreiben? So können wir nur raten...



  • Bitte das Edit meines ersten Posts beachten.

    Hier die Membervariablen:

    //ein knappes dutzend int- und double-Werte
    
    std::string m_sRootdir;
    std::string m_sFileName;
    std::string m_sSaveFileName;
    
    std::ostringstream m_ss;
    
    FILE* m_Fp;
    
    unsigned short* p0[20][20];
    unsigned short* p1[20][20];
    

    Alle member werden korrekt initialisiert.

    Der Filepointer wird eigentlich nicht verwenden( kein fopen etc. ).

    Die einzigen Operationen die auf m_ss angewendet werden sind folgende:

    m_ss.str("");
    	m_ss.clear();
    
    	m_ss << "str1\\"; 
    
    	if( a < 0 )
    	{
    		m_ss << "str2" << std::setw( 3 ) << std::setfill( '0' ) << a * (-1) << "\\";
    	} 
    	if( b == 0 )
    	{
    		m_ss	<< ".abc" << std::ends; 
    	}
    	else if( b == 1 )
    	{
    		m_ss	<< ".def" << std::ends;
    	}
    
    	m_sFileName = "";
    
    	m_sFileName  = m_sRootdir + m_ss.str();
    


  • Erbt Dein Exception werfendes Objekt zufällig von irgendetwas?



  • Nein.

    Allerdings ist die Klasse wie folgt definiert:

    #define DLLEXPORT __declspec(dllexport)
    
    class DLLEXPORT obj;
    

    Kann das was ausmachen?



  • was fuer ne exception fliegt denn? software oder hardware?



  • Sag dem Debugger dass er beim Werfen einer Exception anhalten soll und guck halt einfach nach wo er anhält. Ist jetzt echt nicht so schwer... 🙄
    (Tip: man kann nämlich auch Release-Builds debuggen)

    Falls das aus irgendeinem Grund nicht hinhauen sollte: fang die Exception und gib Typ (typeid) und Fehlertext (what) aus.


Anmelden zum Antworten