2011-08-10 4 views
0

Qt를 사용하여 JSON 객체를 만들고 QJson을 사용하여 QString으로 변환합니다. 이 (정상적으로) 잘 작동하며이 경우 않습니다 있지만 내 Qt 데이터 구조의 소멸자에서 액세스 위반이 발생합니다. 개체가 잘 빌드 된, 내 네트워크 연결을 통해 보내고 함수가 끝난 후 내 응용 프로그램이 충돌합니다.QVariantMap이 소멸자에서 충돌합니다.

내 코드는 다음과 같습니다

void bar() 
{ 
    QVariantMap data; 
    data.insert("Id", 1); 
    QList<QVariant> list; //QVariantList 

    for (QMap<...>:ConstIterator ...) //Loop through a Map 
    { 
     QMap<QString, QVariant> singleEntry; //QVariantMap 
     singleEntry.insert("LocalId", it.value()); 
     QList<QVariant> entryList; //QVariantList 
     for (...) //Loop through another structure 
     { 
      entryList.append("foo"); 
     } 
     singleEntry.insert("List", entryList); 
     list.append(singleEntry); 
    } 
    data.insert("Entries", list); 

    QJson::Serializer.serialize(data); // Works fine 
} // Crash here 

내가 entryList를 구축 내부 루프를 제거하면 모든 것이 잘 작동합니다. data의 소멸자는 내용을 삭제할 수 없지만 나는 그다지 잘 모른다. 전체 데이터 구조를 직렬화하는 동안 잘 될 것 같다 (나는 QJson는 주어진 데이터에서 아무것도 변경되지 않습니다 바랍니다)하지만 .. 내가있어

+0

이 동작은 잘못된 라이브러리를 프로젝트에 연결하는 일반적인 신호입니다. 예를 들어 디버그 모드 라이브러리를 추가하여 프로젝트를 릴리스하거나 비자를 릴리스하는 등의 일반적인 신호입니다. – Raiv

+0

VS를 편집 용도로만 사용하는 것으로 확신 할 수 없습니다. 프로젝트는 JAM을 사용하여 컴파일됩니다. 다른 의존성 때문에 릴리스 버전을 컴파일 할 수 없으며 Qt 디버그 라이브러리 만 링크합니다. 올바른 라이브러리가 프로젝트에 링크되어 있는지 확인할 수 있습니까? – Tobias

답변

0

최고 감사합니다, 토비아스을 정리 할 수 ​​없습니다 내 요구에 맞는 작은 해결 방법. 나는 아직도이 사고가 왜 발생하는지 전혀 모릅니다. 그러나 저는 그것이 어떤 문제인지 알고 있습니다.

는이 같은 정적 구조를 구축하기 위해 노력 :

QVariantMap 
    QVariantList 
    QVariantMap 
     QVariantList 

을과 충돌합니다. 하단의 QVariantList를 제거하고 대신 QVariantMap 또는 다른 것을 추가하면 정상적으로 작동합니다. 이 경우 중첩 수준에 문제가 있다고 생각합니다.

저는 이제 쉼표로 분리 된 QString으로 제 목록에 가입했습니다. 그리고 나서 제대로 작동합니다.

누구나 아이디어가 있다면, 중첩 된 구조체 (다른 정보 : QVariant를 힙에 할당하고 직접 삭제하거나 스택을 삭제하는 경우)가 작동하지 않는 이유는 무엇이며 어떻게 수정해야합니까? 알고있다.

1

Raiv는 디버그 및 릴리스 DLL을 혼합 할 때 발생할 수 있다고 말했지만 내 의견에는 응용 프로그램과 Qt DLL에서 다른 CRT 라이브러리를 사용하는 경우에도 발생할 수 있습니다. 어떤 사람들은 컴퓨터에서 Qt를 재 컴파일 할 때 문제가 사라 졌다고 말합니다. Qt를 다시 작성한 후 CRT dll이 앱과 동일하기 때문에 문제라고 생각합니다. C/C++에서 런타임 라이브러리 옵션을 설정하려고합니다. 코드 생성은 디버그 및 릴리스에 대해 각각 다중 스레드 디버그 DLL (/ MDd) 또는 다중 스레드 DLL (/ MD)로 설정됩니다. QVariantMap, QVariantList, QModelIndexList와 같은 일부 Qt 유형은 아마도/MD (Qt의 dll에서)와 함께 할당되며,/MT (앱에서)와 함께 할당이 해제되면 충돌이 발생한다고 생각합니다. QString :: toStdWString()에서 충돌을 수정할 수도 있습니다. 이것을 연결하기 위해서는 모든 기본 라이브러리 무시를 아니오로 설정하고 특정 라이브러리 무시는 Qt에서 사용하는 crt dll을 언급하지 않아야합니다.

관련 문제