2014-02-10 4 views
1

이 사소한 것을 묻는 것에 사과드립니다.하지만 제대로 이해하지 못하는 것 같아서 메모리 관리에 대해 알고 있다고 생각한 모든 것을 완전히 오해 한 것 같습니다.문자열로 Qt에 QVariantMap 만들기

나는 일부 데이터에 대한 네트워크 응답을 구문 분석하는 기능을 가지고 있고 그것은 다음과 같습니다

// Call from another function 
    QVariantMap *mappedResult = handleReply(reply); 
... 
// Function 
QVariantMap *handleReply(QNetworkReply *reply) { 
    QVariantMap *result = new QVariantMap; 
    QVariant testvalue = new QVariant("testvalue"); 
    result->insert("testkey", testvalue); 
    if (reply->error() > 0) { 
     qDebug() << "Error number = " + reply->errorString(); 
     QVariant variant = QVariant.fromValue(reply->errorString()); 
     result->insert("error", variant); 
    } else { 
     QJsonDocument jsonResponse = QJsonDocument::fromJson(jsonString.toUtf8()); 
     QJsonObject jsonResponseObject = jsonResponse.object(); 
     *result = jsonResponseObject.toVariantMap(); 
    } 
    return result; 
} 

오류가없는 경우는, 결과가 toVariantMap 기능 내장으로 잘 구문 분석됩니다. 그러나 오류가있을 때 함수에서 다시 전송되는 결과에 항목을 작성하려고합니다. 이 함수에서 볼 수 있듯이 두 가지 다른 방법으로 문자열에서 QVariants를 만들려고합니다.

첫 번째 방법은 이와 같은 오류를 범 :

C:\Qt\5.2.0\mingw48_32\include\QtCore\qvariant.h:466: error: 'QVariant::QVariant(void*)' is private inline QVariant(void *) Q_DECL_EQ_DELETE; 
     ^

이런 번째 방법 :

result->insert("testkey", "testvalue"); 
result->insert("error", reply->errorString()); 
: I는 다음과 같이 값을 설정 시도한

[PATH] error: expected primary-expression before '.' token QVariant variant = QVariant.fromValue(reply->errorString()); 

마지막 접근 방식은 컴파일 오류를주지 않지만 return 문에서 result 변수는 반환 할 수 없습니다. 디버거에서 검사하고 return 문을 실행하자마자 응용 프로그램이 "new"를 제대로 사용하지 않는다는 메모리 문제로 인해 충돌합니다.

"Error accessing memory address 0x...". 

최소한의 지식이있는 사람이이 간단한 작업을 수행하는 방법을 분류하는 데 도움이 될 수 있다면 매우 유용 할 것입니다. 사용자 정의 문자열을 키/값 쌍으로 사용하여 함수에서 QVariantMap을 반환하려면 어떻게해야합니까?

환호.

답변

2

내가 (수정과) 다음과 같은 방법으로 함수 작성합니다 : 당신이 값을 전달하는 변형 맵 instread에 대한 포인터와 함께 작업해야 할 이유는 아직 불분명하지만

QVariantMap *handleReply(QNetworkReply *reply) { 
    QVariantMap *result = new QVariantMap; 
    QVariant testvalue("testvalue"); // <- fixed here 
    result->insert("testkey", testvalue); 
    if (reply->error() > 0) { 
     qDebug() << "Error number = " + reply->errorString(); 
     QVariant variant(reply->errorString()); // <- fixed here 
     result->insert("error", variant); 
    } else { 
     QJsonDocument jsonResponse = QJsonDocument::fromJson(jsonString.toUtf8()); 
     QJsonObject jsonResponseObject = jsonResponse.object(); 
     *result = jsonResponseObject.toVariantMap(); 
    } 
    return result; 
} 

을, ?

+0

QVariant 인스턴스화에 대한 수정 해 주셔서 감사합니다. 저는 값으로 전달하는 것이 더 깔끔하다는 것에 동의합니다. 그래서 업데이트했습니다. 나는 포인터를 사용하고 있었고 "new"는 내가 얻었던 메모리 오류가지도 내용이 반환 될 때 덮어 써 졌기 때문이라고 생각했기 때문에. 그것은 seg 오류가 발생한 Qt 디버거에 문제가있는 것 같습니다. 오 잘, 누군가가 언젠가는 도움이되기를 바랍니다 :) – span