std::string Debug



  • Hallo,

    ich habe eine DLL eines anderen Programms, die Funktionen der Form func(std::string *str) anbietet. Diese DLL wurde offenbar als Debugversion ausgeliefert, da die Funktion nur richtig funktioniert, wenn man ihr einen std::string im Debugmodus übergibt. Die Release-Version funktioniert nicht. Mein ganzes Programm deswegen im Debugmodus zu kompilieren möchte ich eigentlich auch nicht.
    Gibt es eine Möglichkeit trotz globalem Releasemodus std::string in der Debugversion zu benutzen?

    greetz KN4CK3R



  • mh vielleicht geht sowas dreckiges wie vor dem include von string #define _DEBUG zu setzen und danach auszuschalten. müsstes du aber vor jedem #include <string> machen



  • hm, das könnte ich wirklich mal probieren...da der include nur an einer Stelle vorkommt, ist das auch kein großes Problem.

    habs jetzt so gelöst und es funktioniert:

    #ifndef _DEBUG
    #	define _DEBUG
    #	include <string>
    #	define _RELEASE
    #else
    #	include <string>
    #endif
    

    Ist zwar nicht schön, aber es tut seinen Job. Danke dir vor den Denkanstoß 🙂

    greetz KN4CK3R



  • Je nachdem, was der <string> -Header sonst noch für Abhängigkeiten hat, kannst du damit richtig auf die Schnauze fallen, da du dann plötzlich im gleichen Programm verschiedene inkompatible Versionen der Laufzeitbibliothek (eigentlich sogar noch schlimmer: verschiedene Stücke davon) benutzt.

    So, wie du es momentan gerade machst, kompilierst du einfach im Debug-Modus, kann gut sein, dass es funktioniert 😉

    Bist du sicher, dass es keine Release-Version der DLL gibt? Könntest du nicht eine solche anfordern?



  • ja, es gibt nur die eine Version (momentan). Ob ich nun die (eventuell) verstückelten Laufzeitmodule lade oder die andere DLL wird wohl aufs gleiche rauskommen. Falls es wirklich an anderen Stellen weiterhin klemmen sollte, lass ich halt alles im Debugmodus.

    greetz KN4CK3R



  • KN4CK3R schrieb:

    Ob ich nun die (eventuell) verstückelten Laufzeitmodule lade oder die andere DLL wird wohl aufs gleiche rauskommen.

    Nein, die Release-DLL ist in sich konsistent und wurde als Ganzes kompiliert. Du kannst den std::string -Teil deines Programms nicht einfach im Debug-Modus kompilieren und den Rest im Release, dazu sind die Teile der Standardbibliothek zu wenig modular. Zum Beispiel kann die Heapverwaltung im Debug- und Release-Modus verschieden implementiert sein. Wenn du das mischst, hast du sehr schnell Probleme.

    Es kann zwar sein, dass dieser Hack zufälligerweise gerade funktioniert, aber so können auch sehr mühsame und schwer auffindbare Fehler entstehen. Wie gesagt geht es bei dir wahrscheinlich vor allem deshalb, weil du durch die Definition von _DEBUG im Prinzip den Debug-Modus nutzt (und zwar für den gesamten nachfolgenden Code, nicht nur <string> ).

    Wie kommst du überhaupt auf _RELEASE ?


Anmelden zum Antworten