関数の戻り文字列における c_str() の謎を明らかにする
c_str() 関数は、std:: を変換するための強力なツールです。 string オブジェクトを const char* に変換します。ただし、文字列を返す関数の戻り値に直接適用すると、不可解な結果が生じる可能性があります。
問題の本質
次のコードを考えてみましょう。スニペット:
string str = SomeFunction(); const char* strConverted = str.c_str(); // strConverted stores the value of the string properly const char* charArray= SomeFunction().c_str(); // charArray stores garbage value static string SomeFunction() { string str; // does some string stuff return str; }
このシナリオでは、strConverted は返された文字列の値を正しく保持します。ただし、charArray は意味不明なものでいっぱいです。この不可解な動作はなぜ起こるのでしょうか?
一時変数の詳細
鍵は戻り値の性質にあります。 SomeFunction() が文字列を返す場合、その文字列は実際には一時オブジェクトです。一時オブジェクトの有効期間は限られており、通常はコードの現在のブロックの終わりで終了します。
ダングリング ポインタの罠
c_str() は、文字列の内部バッファ。一時文字列 (SomeFunction().c_str() など) を直接呼び出すと、一時オブジェクトがすぐに消えるため、返されるポインタはダングリング ポインタになります。このぶら下がりポインタは、信頼性の低いデータで charArray を悩ませるものです。
解決策: 有効期間の延長
これらの危険を回避するには、一時文字列の有効期間を延長することが不可欠です。簡単なアプローチの 1 つは、str_copy の例で示すように、新しい文字列変数に代入することです。そうすることで、文字列オブジェクトは永続化され、c_str() からの有効なポインターが確保されます。
結論
関数の戻り文字列を扱うときは、次のような場合に注意する必要があります。戻り値に直接 c_str() を使用します。ダングリング ポインタの落とし穴を防ぐには、c_str() を呼び出す前に戻り値を新しい文字列変数に割り当てます。これにより、文字列の内容への安定したポインタが保証されます。
以上が`c_str()` を関数の戻り文字列に直接使用すると、なぜガベージが返されるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。