文字列を返す関数で std::string.c_str() の呼び出しが失敗する理由
次のコードを考えてみましょう:
<code class="cpp">std::string getString() { std::string str("hello"); return str; } int main() { const char* cStr = getString().c_str(); std::cout << cStr << std::endl; // Outputs garbage }</code>
直感的には、getString() から返された一時文字列が main() のスコープ内で有効なままであることが期待されます。しかし、これは誤りです。
問題は、 C の一時オブジェクトの有効期間にあります。一時オブジェクトは、参照にバインドされているか、名前付きオブジェクトの初期化に使用されていない限り、作成された式の最後に破棄されます。この場合、getString() は一時文字列を返しますが、これは main() の式の最後で破棄されます。
その結果、cStr はダングリング ポインターを保持し、それを使用すると未定義の動作が発生する可能性があります。この問題を回避するには、名前付き変数または参照を使用して、返される文字列の有効性を確認します。例:
<code class="cpp">std::string returnedString = getString(); const char* cStr = returnedString.c_str(); std::cout << cStr << std::endl; // Safe</code>
または、一時文字列を変数に割り当てずに直接使用することもできます:
<code class="cpp">std::cout << getString().c_str() << std::endl; // Also safe</code>
以上が質問と回答の形式に適合し、記事の内容を正確に説明するいくつかのタイトル オプションを次に示します。 **オプション 1 (ショート & ダイレクト):** * **Re で `std::string.c_str()` を呼び出すのはなぜですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。