以下のコードは、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 *を渡す必要があるという結論に達しました。
バッファを 'response_Json'関数に渡す必要があり、その関数は文字列をバッファにコピーする必要があります。 –
'stddup(stream.str()。c_str())を返すことは解決策かもしれませんが、後で解放する必要があります。 – Jarod42
これはとにかく動作しません。 'static's(他のすべてのオブジェクトと同様)は、_once_のみ初期化されます。後でこれを実行するには、割り当てを実行する必要があります。 –