0

私は何か間違ったことをしたと確信していますが、私の一生の間、私は何を理解することができません!次のコードを検討してください。

cerr<<el.getText()<<endl;
cerr<<el.getText().c_str()<<endl;
cerr<<"---"<<endl;
const char *value = el.getText().c_str();
cerr<<"\""<<value<<"\""<<endl;
field.cdata = el.getText().c_str();
cerr<<"\""<<field.cdata<<"\""<<endl;

elXML要素でありgetText、std::stringを返します。予想通り、同じ値を出力しますel.getText()el.getText().c_str()ただし、の結果を割り当てた場合は、-、つまり空の文字列-にvalue設定されます。このコードはsetのために書かれていたので、それをクリアしていました。と思われる同じ式に変更すると、から設定され、正常に動作し、最後の行に期待値が出力されます。""c_str()field.cdata=valuevalue

はスタック上にあるのでel、私はそれを壊していたのではないかと思いましたが、valueが設定された後でも、の基になる値elはまだ正しいです。

私の次の考えは、constポインターへの割り当てに関して、コンパイラー固有の奇妙な問題があるということでした。そこで、次のように書きました。

std::string thing = "test";
std::cout << thing << std::endl;
std::cout << thing.c_str() << std::endl;
const char* value = thing.c_str();
std::cout << value << std::endl;

さすがに「テスト」を3回受けます。

だから今、私は何が起こっているのか分かりません。私のプログラムでは、サンプルでは発生していない奇妙なことが起こっていることは明らかですが、それが何であるかはわかりません。また、見続ける方法についてのアイデアがありません。誰かが私を啓発することができますか、または少なくとも私を正しい方向に向けることができますか?

4

1 に答える 1

5

一時オブジェクトel.getText()を返していると思います。stringそのオブジェクトが破棄されると、によって返されるポインタは無効にc_str()なります(他の方法でも、によって返されるポインタc_str()が無効になる可能性があることに注意してください)。

一時オブジェクトは、それが作成された完全な式の最後で破棄されます(これは通常、上記の例ではセミコロンにあります)。

次のような方法で問題を解決できる場合があります。

const char *value = strdup(el.getText().c_str());

charこれは、動的に割り当てられたメモリに生の配列として文字列のコピーを作成します。free()次に、そのデータが不要になった時点で、そのポインタを呼び出す責任があります。

于 2013-01-26T03:31:54.833 に答える