2013-03-25 2 views
11

지금 2 시간 동안 디버깅을 해왔습니다. 내가 QString::toStdStringstd :: string 소멸자에서 QString :: toStdString()이 충돌합니다.

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

를 호출하면 프로그램은 나중에 내가 처음에 메모리 손상을 줄 알았는데 표준 : : 문자열 소멸자

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

에 충돌, 그러나 이것은 main()는 만 2 개 라인을 포함되어있는 경우에도 발생합니다. 왜 이런 일이 일어나는 지 아는 사람이 있습니까? 어떻게 해결할 수 있습니까?

내 Qt 버전은 4.8.1입니다.

+0

사용하는 Qt는 어떤 버전 - 당신은 "> 코드 Generation-> 런타임 라이브러리 속성 -> C/C++ 구성"에 그것을 발견 할 것이다

? 참조 대신에'string temp = s.toStdString();'문자열의 복사본을 저장하면 어떻게 될까요? – RedX

+0

같은 일이'string temp = s.toStdString();'에서 발생합니다.'toStdString()'에 의해 반환 된 임시 변수의 소멸자가 즉시 호출되기 때문에 더 일찍 발생합니다. Qt 버전을 어떻게 사용합니까? 어디서 봤어? 이 프로젝트는 다른 사람들에 의해 설정되었으므로 Qt Creator에서만 Visual Studio에서 Qt를 사용 해본 경험이 없습니다. – sashoalm

+1

이것을 시도해보십시오 :'std :: string stdUtf8 = qs.toUtf8(). constData();' – Najzero

답변

8

Qt DLL은 STL 지원 및 코드와 정확히 동일한 C 런타임 라이브러리로 컴파일해야합니다. 동시에 두 개의 다른 CRT를 사용하는 것처럼 보입니다. 그러면 Qt가 한 힙에서 만든 객체를 프로그램에서 사용하는 힙으로 파괴합니다.

종속성 워커로 DLL 사용을 확인하십시오!

+0

나는 .exe와 QtCored4.dll을 모두 열었지만 무엇을 찾아야할지 모르겠습니다. 그들에게는 엄청난 의존 관계가 있습니다.다른 CRT를 사용하고 있는지 어떻게 알 수 있습니까? 이름이 다른가요? – sashoalm

+0

애플리케이션에 사용하는 것과 동일한 컴파일러로 Qt를 컴파일했는지 확인하십시오. 또한 디버그 및 릴리스를 혼합하지 않도록하십시오. – drescherjm

+0

DependencyWalker ("Profiling")에서 응용 프로그램을 시작하고로드 된 MS-CRT 수를 확인하십시오. 둘 이상일 경우, 문제가 발생할 가능성이 큽니다. – Jens

0

다른 방법으로 문제를 해결해 보았습니다. Visual Studio에서 새 프로젝트를 만들었고 테스트 코드가 충돌하지 않았습니다. * .vcproj 파일과 WinMerge의 차이점을 조사한 결과, 충돌이 프로젝트의 사용자 정의 변경 사항 (런타임 라이브러리와 관련 있음)에 의해 발생한 것으로 나타났습니다. 이 충돌이 재현되도록 최소한의 차이 WinMerge를 만든 패치입니다 :

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

가장 가능성이 높은 이유는 당신의 런타임 라이브러리가 "(/ MT) 멀티 스레드"이라고 할 수 있으며, 당신은 변경해야 "멀티 스레드 DLL (/ MD)"(릴리스 버전 인 경우)

"멀티 스레드 디버그 (/ MTd)"에서 "멀티 스레드 디버그 DLL (/ MDd) "

Qt가 이상하게 컴파일 된 경우 솔루션이 반대가됩니다.