2016-04-19 5 views
0

以下のコードは、C++クラスのCラッパーにあります。私は私のjson :: valueオブジェクトから応答の文字列値を返す必要があります。問題は、c_str()を使用すると、関数の最後に破棄されるポインタが返されることです。したがって、私は恐ろしいと危険なコードの下にいる: -どこでも静的なconst変数を避けること

const char* const response_Json(CResponse *resp) { 
    using namespace myclient; 
    Response *t = (Response*)resp; 
    const web::json::value& json = t->Json(); // NOTE: Json() can ONLY be called ONCE 
    std::ostringstream stream; 
    stream << json; // REQUIRED to get raw JSON as text, as serialize(void) does NOT work 
    //t->Json().serialize(stream); // Doesn't work - blank result 
    std::string asstr = stream.str(); 
    static const std::string& statref = stream.str(); // REQUIRED to ensure reference to string, and thus contained c_str, is not destroyed 
    static const char* pref = statref.c_str(); // REQUIRED so we have a local char pointer that is not temporary, and thus destroyed at function's exit 

    return pref; 
} 

statrefと県の両方が実際に(というぶら下げポインタよりも、返される値のために、静的定数として宣言される必要があることを、私を見つけましたつまり静的なconstは、オブジェクトグラフ全体をasstrに必要としましたが)なぜ私は確信していません。私はprefのものが十分であると思ったでしょう。

私はこの関数が複数回、おそらく並行して呼び出されるため、すべての静的変数を削除したいと考えています。

私がする必要があるのは、静的constの使用を避けるC char *またはそのコピーを返すことです。私は何日も探していて、答えをどこにも見つけることができません。

結論私は、この関数が返り値ではなく変更するchar *を渡す必要があるという結論に達しました。

+2

バッファを 'response_Json'関数に渡す必要があり、その関数は文字列をバッファにコピーする必要があります。 –

+2

'stddup(stream.str()。c_str())を返すことは解決策かもしれませんが、後で解放する必要があります。 – Jarod42

+0

これはとにかく動作しません。 'static's(他のすべてのオブジェクトと同様)は、_once_のみ初期化されます。後でこれを実行するには、割り当てを実行する必要があります。 –

答えて

2

バッファをresponse_Json関数に渡す必要があり、その関数は、呼び出し側が提供するバッファに文字列をコピーする必要があります。何のバッファオーバーランのチェックはここで行われていない簡略化のために

void const response_Json(CResponse *resp, char *buffer) { 
    using namespace myclient; 
    Response *t = (Response*)resp; 
    const web::json::value& json = t->Json(); // NOTE: Json() can ONLY be called ONCE 
    std::ostringstream stream; 
    stream << json; // REQUIRED to get raw JSON as text, as serialize(void) does NOT work 
    //t->Json().serialize(stream); // Doesn't work - blank result 
    std::string asstr = stream.str(); 
    strcpy(buffer, asstr.c_str); 
} 

Basiallyあなたがこれを必要とします。

多分、関数のjson stuffセクションにまだ改良の余地があります。

関連する問題