2016-08-17 15 views
-1

何らかの理由で空文字列を返します。const chart**out_functionは、ファイル操作のメソッド名をfopenのように保持するので、基本的にはc_str()にある文字列を変換していますが、私はちょうど操作名と辞書を用意c_str()は空文字列を返します

この部分で

呼び出しを行う方法を以下の空の文字列は、あなたが、私はちょうど

pp::VarDictionary fileOp; 
    pp::VarArray args; 
    args.Set(0, "filename.txt"); 
    args.Set(1, "wb"); 
    fileOp.Set("args", args); 
    fileOp.Set("cmd", "fopen"); 

この関数を文字列として「fopenを」送信しています気づくことができるように、あります上記で送られた辞書を解析し、関数の名前をout_functionとに返しますout_params

int ParseMessage(pp::Var message, const char** out_function, 
     pp::Var* out_params) { 

で私はC_STRINGに文字列を変換するためのコード行を使用しますが、それはここで空のテキスト

*out_function = cmd_value.AsString().c_str(); 

を返し、それがGoogleのNative Clientのではなく、に基づいており、完全なコードですそれは、標準のC/C++コード

http://pastebin.com/S4P8aZqL

+0

破棄された一時的なポインタを格納しています。 –

+2

タグをスパムしないでください。言語は「C/C++」であり、スニペットはC++ではありません。 – Olaf

+0

これは3つすべてに関連しています。私は迷惑をかけていません。 –

答えて

7

c_str()の結果は長いAとしてのみ有効であると同時に■その結果を生成したオブジェクトstd::stringが有効です。

AsString()コールでは、の一時的なstd::stringオブジェクトが生成され、すぐに破棄されます。その後、そのc_str()呼び出しの結果は意味をなさない。そのポインタが指すメモリにアクセスしようとすると、未定義の動作につながります。

c_str()によって返されたポインタを格納しようとしないでください。その文字列を長時間C文字列として使用する必要がある場合は、メモリバッファを自分で割り当てて、c_str()の結果をそのバッファにコピーします。

別の(もっと良い)アイデアは、C文字列への変換を急ぐことではありません。結果をstd::stringとして返し、最後にc_str()と呼んでください。本当に本当にC文字列が必要です。

+0

答えをありがとう、私はこの問題を解決するために使用したコードです '* out_function = strdup(cmd_value.AsString()。c_str());' –

+0

@Mohammad Abu Musa:それは解決しますしかし、手動で管理するための 'malloc'ブロックのrawメモリーがあります。私が言ったように、もっと良いアイデアは、最後の瞬間まで 'std :: string'を使うことに切り替えることでしょう。 – AnT

+0

ありがとう、私はちょうどそれをしました、私は 'std :: string'を使う方がはるかに良いアプローチだと思います –

関連する問題