2013-03-25 23 views
11

Debugowałem to przez 2 godziny, a to sprowadza się do tego. Jeśli zadzwonię QString::toStdStringQString :: toStdString() wywala na std :: string destructor

QString s = "testtesttesttesttesttest"; 
const std::string &temp = s.toStdString(); 

program później wywala na std :: string destructor

__CLR_OR_THIS_CALL ~basic_string() 
    { // destroy the string 
    _Tidy(true); // <---- It crashes on this line. 
    } 

myślałem, że to uszkodzenie pamięci na początku, ale to się dzieje, nawet jeśli main() zawiera tylko 2 linie. Czy ktoś wie, dlaczego tak się dzieje, a także jak mogę to naprawić?

Moja wersja Qt to 4.8.1.

+0

Jaka wersja Qt używasz? Co się stanie, jeśli zamiast referencji zostanie zapisana kopia ciągu 'string temp = s.toStdString();'? – RedX

+0

To samo dzieje się z 'string temp = s.toStdString();', to dzieje się wcześniej, ponieważ destruktor zmiennej tymczasowej zwróconej przez 'toStdString()' jest wywoływany natychmiast. Jak mogę zobaczyć wersję Qt, której używam? Gdzie mam wyglądać? Projekt został skonfigurowany przez inne osoby, nie mam doświadczenia z używaniem Qt z Visual Studio, tylko z Qt Creator. – sashoalm

+1

spróbuj tego: 'std :: string stdUtf8 = qs.toUtf8(). ConstData();' – Najzero

Odpowiedz

8

Twoje biblioteki DLL Qt muszą być skompilowane z obsługą STL i dokładnie taką samą biblioteką C-Runtime jak twój kod. Wygląda na to, że używasz dwóch różnych CRT w tym samym czasie, co zniszczyłoby obiekty utworzone na jednym stosie przez Qt do stosu używanego przez twój program.

Sprawdź użycie DLL przy użyciu Dependency Walker!

+0

Otworzyłem oba pliki .exe i QtCored4.dll, ale nie jestem pewien, czego szukać. Mają strasznie dużo zależności.Skąd mam wiedzieć, czy używają różnych CRT? Różne nazwy, czy coś innego? – sashoalm

+0

Tylko upewnij się, że skompilowałeś Qt z tym samym kompilatorem, którego używasz dla swojej aplikacji. Upewnij się też, że nie mieszałeś Debugowania i Release. – drescherjm

+0

Uruchom aplikację z DependencyWalker ("Profilowanie") i zobacz, ile załadowanych MS-CRT. Jeśli jest ich więcej, masz spore szanse popaść w kłopoty. – Jens

0

Próbowałem rozwiązać problem w inny sposób. Stworzyłem nowy projekt z Visual Studio, a kod testowy tam się nie zawiesił. Po zbadaniu różnic między plikami * .vcproj z WinMerge, stwierdziłem, że przyczyną awarii są niestandardowe zmiany w projekcie dotyczące - jak się domyślacie - bibliotek środowiska wykonawczego. Jest to łatka stworzona przez WinMerge minimalne różnice, które powodują katastrofy być powielana:

112c112 
<    RuntimeLibrary="3" 
--- 
>    RuntimeLibrary="1" 
126a127,128 
>    LinkLibraryDependencies="true" 
>    UseLibraryDependencyInputs="false" 
127a130,131 
>    IgnoreAllDefaultLibraries="false" 
>    IgnoreDefaultLibraryNames="msvcrtd.lib" 
0

Najbardziej prawdopodobną przyczyną może być to, że Runtime Library jest „Wielowątkowym (/ MT)” i trzeba zmienić do "wielowątkowej biblioteki DLL (/ MD)" (jeśli jesteś w wersji Release)

Jeśli korzystasz z wersji debugowania, zmień wartość z "Multi-threaded Debug (/ MTd)" na "Debugowanie wielowątkowe" DLL (/ MDd) "

Jeśli masz dziwną kompilację Qt, rozwiązanie powinno być odwrotne.

Przekonasz się, że na "Konfiguracja Ustawienia-> C/C++ -> Kod Generation-> Runtime Library"