ホームページ  >  記事  >  バックエンド開発  >  質問と回答の形式に適合し、記事の内容を正確に説明するいくつかのタイトル オプションを次に示します。 **オプション 1 (ショート & ダイレクト):** * **Re で `std::string.c_str()` を呼び出すのはなぜですか

質問と回答の形式に適合し、記事の内容を正確に説明するいくつかのタイトル オプションを次に示します。 **オプション 1 (ショート & ダイレクト):** * **Re で `std::string.c_str()` を呼び出すのはなぜですか

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-25 09:23:02675ブラウズ

Here are a few title options that fit the question-answer format and accurately describe the article's content:

**Option 1 (Short & Direct):**

* **Why Does Calling `std::string.c_str()` on a Returned String Lead to Undefined Behavior?** 

**Option 2 (M

文字列を返す関数で 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。