2011-07-01 10 views
1

C 라이브러리에서 검색 한 JSON 개체를 QVariant로 변환하는 기능이 있습니다. 모든 데이터 유형은 잘 작동합니다. 즉, 부울, 숫자, 문자열, 객체 /지도 --- 목록을 제외하고. 함수가 목록을 반환하면 "RtlValidateHeap에 지정된 잘못된 주소"로 인해 함수가 종료 될 때 충돌합니다. 이중 자유가 발생했다는 것을 의미합니다.Visual Studio 2008에서 QVariantList를 반환하면 오류가 발생합니다.

다음 코드는 오류 보여줍니다 : 나는 이것에 대해 글을 보았다

QVariant no_crash() { 
    QVariantMap map; 

    map["Hello"] = "world!"; 
    qDebug() << map; 
    return map; 
} 
// QMap(("Hello", QVariant(QString, "world!"))) 

QVariant crash() { 
    QVariantList list; 

    list << "Hello world!"; 
    qDebug() << list; 
    return list; 
} 
// (QVariant(QString, "Hello world!")) 

,하지만 그들은 모두 비주얼 스튜디오 2010는 Qt는 SDK의 바이너리 버전과 호환되지 않는 대해 것 같다. 나는 http://qt.nokia.com/downloads/sdk-windows-cpp에서 다운로드 한 Qt 4.7.3을 사용해 보았습니다.

목록이 범위를 벗어날 때 충돌이 발생합니다. 반환 값이 호출 스택에 다시 전파되는 한 충돌이 발생하지 않습니다.


답장을 보내 주셔서 감사합니다.

예, 나는 다른 값을 반환 할 때 컴파일러가 QVariant를 구성 것을 완벽하게 알고,하지만 난 컴파일러는 암시 것 :-)

내에서 어떤 명시 적 코딩에 비해 동등하게 좋은 QVarint를 구축한다는 확신 필자가 제공 한 링크에서 설치하면 MinGW 및 Visual Studio 2008 용 라이브러리가 모두 설치됩니다. \ Desktop \ Qt \ 4.7.3 \ msvc2008 \ lib를 글로벌 lib 파일 검색 경로에 추가했습니다. 프로그램을 실행하면 Visual Studio 출력 창에 \ Desktop \ Qt \ 4.7.3 \ msvc2008의 DLL 만 나열됩니다. 짐을 실은.

msvcr90d.dll에서 오류가 발생합니다. 아마도 메모리가 다시 해제 될 때입니다. 스택이 파괴 된 것처럼 보이기 때문에 알기가 어렵습니다.

응용 프로그램이 다소 큰데, GUI는 C++로 작성되고 나머지는 C로 작성됩니다. 이것이 문제가 될 수 있습니까? 프로그램은 msvcp90d.dll과 msvcr90d.dll을 모두로드합니다.

+0

저는 소스에서 Qt를 빌드 중입니다. 한번 해보 았으면 여기에 의견을 추가하겠습니다. –

답변

0

귀하의 방법 서명은

QVariant crash() 

당신은 대신 당신이 QList <QVariant>

동의어입니다 QVariantList을 반환하려고된다 QVariant의 QVariant를 반환해야이다 나는 생각하지 않는다 너는 이것을 할 수있다.

제 생각에는 이것을 컴파일 할 수 없어야합니다. 어쩌면 이것이 당신 문제일까요?

첫째, 당신이 링크 SDK이는 MinGW 컴파일러가 아닌 비주얼 스튜디오를위한 것입니다

+0

QVariant는 QVariantLists를 보유 할 수 있습니다 –

0

나는 잠재적 인 문제의 몇 참조하십시오. 컴파일러에 올바른 SDK를 사용하거나 소스에서 Qt를 다시 컴파일해야합니다. VS2008의 경우이 페이지로 이동 : http://qt.nokia.com/downloads/ 그리고 "Windows 용 Qt 라이브러리 - VS2008"을 다운로드하십시오.

코드가 컴파일됩니다. QVariantMap 또는 QVariantSet을 포함하는 QVariant가 반환됩니다. 컴파일러는 QVariant를 생성합니다.

QVariant no_crash() { 
    QVariantMap map; 

    map["Hello"] = "world!"; 
    qDebug() << map; 
    return QVariant(map); // This returns a QVariant which contains a map of QVariants 
} 

QVariant crash() { 
    QVariantList list; 

    list << "Hello world!"; 
    qDebug() << list; 
    return QVariant(list); // This returns a QVariant which contains a list of QVariants 
} 

이 확인을 작동합니다 - 난 그냥 여기를 컴파일하고 나를 위해 작동 : 어떤 코드가 실제로하는 일은 이것이다. QVariant를 사용할 때 QVariant의 유형을 확인해야합니다. 예를 들어 반환 된 QVariant를 호출하면 목록 인이므로 빈 문자열이 반환됩니다. QVariant 이 아닙니다. 목록)

+0

Visual Studio 전용 버전을 다운로드했습니다. 더 빨리 다운로드하고 설치할 수 있었지만 같은 충돌이 발생했습니다. –

+0

솔루션의 개별 프로젝트가 정적 런타임에 연결되는 반면 Qt 라이브러리는 동적 런타임에 링크되는 것으로 밝혀졌습니다. –

2

솔루션의 개별 프로젝트가 정적 런타임에 연결되어있는 반면 Qt 라이브러리는 동적 런타임에 연결되어 있다는 오류가 나타났습니다.

솔루션에 포함되어 있지 않지만 이미 빌드 된 프로젝트의 구성뿐만 아니라 20 개 이상의 프로젝트도 살펴 보았습니다. C 런타임에 정적으로 링크 된 하나라도 응용 프로그램이 중단되면 .

프로젝트의 속성을 열고 구성 속성 -> C/C++로 이동 한 다음 코드 생성을 선택하여 런타임을 변경합니다. 런타임 라이브러리는 릴리스 대상에 대한 다중 스레드 DLL과 디버그 대상에 대한 다중 스레드 디버그 DLL이어야합니다.

0

C/C++ 코드 생성의 런타임 라이브러리 옵션이 디버그 및 릴리스에 대해 각각 다중 스레드 디버그 DLL (/ MDd) 또는 다중 스레드 DLL (/ MD)로 설정되어 있는지 확인하십시오. QVariantMap, QVariantList, QModelIndexList과 같은 일부 Qt 유형은/MD (Qt의 dll에서)와 함께 할당되며/MT (앱에서)로 할당 해제 될 때 충돌이 발생한다고 생각합니다. 또한 QString::toStdWString()에서 충돌을 해결할 수 있습니다. 이것을 연결하기 위해서는 모든 기본 라이브러리 무시를 아니오로 설정하고 특정 라이브러리 무시는 Qt에서 사용하는 crt dll을 언급하지 않아야합니다.

관련 문제