Warum geht das nicht?



  • Original erstellt von ChrisM:
    Mal ne Frage, was hindert mich daran, das Template zu verändern wie ich will?
    Ja, ich weiß, ich sollte an den Headern nix verändern, aber so ein kleiner Engriff kann doch net schaden, oder?

    jo genau und wenn jemand anders mal dein programm kompilieren will muss er sich extra noch deine frisierte stdandardbibliothek besorgen. und da deine nicht header anders heissen muss er noch extra zum kompilieren des einen programms den inluce path änder.... ausserdem kann die stdlib kompilerspezifisches zeug enthalten blah blah blah...

    [ Dieser Beitrag wurde am 20.04.2003 um 14:41 Uhr von japro editiert. ]



  • OK, überzeugt, der Header bleibt wie er ist 😃

    ChrisM



  • So, die Probleme gehen schon los:
    Ich hab eine Funktion, die eine Exception wirft. Wenn ich als Parameter an diese Funktion nichts übergebe (als Parameter = void) klappt alles, übergebe ich aber ein const CString&, krieg ich nur "Debug Assertion failed! ... Expression: _CrtIsValidHeapPointer(pUserData)", wenn ich auf ignorieren drücke, dann noch eine andere Debug Assertion, dann wird die Exception behandelt und am Schluss noch eine Schutzverletzung. 😞

    Könnte das evtl. doch was mit dem Destruktor zu tun haben? (meine hat ja keine Member und folglich auch keinen Destruktor, ich verlass mich einfach auf den von std::string)

    ChrisM



  • minimalcode posten



  • So, wenn ich die Laufzeitbibliothek bei meiner DLL, die die Funktion hat, die die Exception wirft, und bei meiner EXE, die diese aufruft, auf Multithreaded DLL Debuggen stelle, gehts, aber ich will bei diesem Projekt keine geshared Laufzeitbibliothek!
    Kann das evtl. daran liegen, dass meine EXE den String erzeugt und die DLL ihn dann deleted (d.h. es versucht, weil er ja auf dem Heap der EXE liegt)? Aber eigentlich darf die DLL sowas doch auch bei einer Exception nicht versuchen, wenn nur eine konstante Referenz übergeben wird? Von Parametern aufrufen war bei Wurf einer Exception nirgends die Rede 😞

    ChrisM



  • Minimalcode, ok:

    // DLL - wenn ich den strName Parameter auskommentiere, gehts!
    class CScriptLanguageMgr
    {
    public:
        AGEAPI IScriptLanguage &GetScriptLanguage(const CString &strName) const;
    };
    
    void CScriptLanguageMgr::UnregisterScriptLanguage(const CString &strName)
    {
        /*// Remove specified instance of IScriptLanguage from the map
        ScriptLanguageMap::iterator i = m_ScriptLanguageMap.find(strName);
        if (i != m_ScriptLanguageMap.end())
            m_ScriptLanguageMap.erase(i);
        else*/
            //AGEERROR(CScriptLanguageNotFoundException, "Script language '" + strName + "' not found!");
            //throw CScriptLanguageNotFoundException("test", __FILE__, __LINE__);
        throw 1;
    }
    
    // EXE
    
    (pKernel->GetScriptLanguageMgr()).UnregisterScriptLanguage("a");
    

    ChrisM



  • So, sogar wenn ich statt CString std::string einsetze, tritt der Fehler auf!

    ChrisM



  • Ist das überhaupt gültig?

    (pKernel->GetScriptLanguageMgr()).



  • Ja, 100%. Und selbst wenn es nicht gültig wäre, würde es ja nichts machen, weil ich in der Funktion ja nicht auf this zugreife (siehe Quellcode oben). 🙂

    ChrisM



  • *push*

    ChrisM


Anmelden zum Antworten