0

Rapidjson ドキュメントをメンバー変数として使用し、これを行うと、次のようになります。

class Test
{
     rapidjson::Document    m_jsonDocument;

public:
    void f()
    {
        // WORKS FINE
        rapidjson::Document document;
        if (document.Parse<0>("{ \"hello\" : \"world\" }").HasParseError())
            printf("ERROR PARSING JSON\n");
        else
            printf("%s\n", document["hello"].GetString());


         // BUT HERE THROWS, WHY?
         if (m_jsonDocument.Parse<0>("{ \"hello\" : \"world\" }").HasParseError())
             printf("ERROR PARSING JSON\n");
         else
            printf("%s\n", m_jsonDocument["hello"].GetString());
    }
};

CTORでオンラインでif (m_jsonDocument.Parse<0>("{ \"hello\" : \"world\" }").HasParseError())アプリを呼び出すと、クラッシュします。Visual Studio デバッガーは、"メモリを読み取れません" と表示されます。のために。何が問題ですか?メンバー変数とローカル変数の違いは何ですか?flags_ = defaultFlags[type];document.hGenericValue(Type type)_flags


編集:f defined here を使用してコールバックとして設定し、 setResponseCallback defined here使用fしてコールバックとして呼び出されています 。dispatchResponseCallbacks

4

2 に答える 2

0

@JoachimPileborgが指摘したようにf();、彼が詳細に説明した理由の1つを呼び出す方法が重要です。正しい方向に導いてくれた Joachim に感謝します。実際、私の問題は Joachim が考えるよりも愚かでした :)。問題はf、HTTP 要求への応答が戻ってきたときに呼び出していたことです (fコールバック関数でした)。Test t;しかし、スタックに割り当てた限り、メモリは割り当てthis解除され、応答が返された時点で無効でした。私は知っています、それは本当にばかげています:)。

于 2014-05-13T14:10:27.080 に答える