文字列を返す関数の std::string.c_str() が失敗する理由を理解する
C で、関数が文字列を返す場合、それは値によって行われます。これは、返された文字列が元の文字列への参照ではなく、そのコピーであることを意味します。これは、デフォルトで参照によって返される他の組み込み型 (整数や浮動小数点など) の動作とは異なります。
この例では、関数 getString() はコピーである文字列オブジェクトを返します。文字列「こんにちは」。このコピーはメモリ内の一時的な場所に保存されます。 const char* cStr = getString().c_str(); という行返された文字列を表す C スタイルの文字列を取得しようとします。ただし、一時文字列はすでに破棄されているため、ポインタ cStr は無効なメモリを指しています。
一時オブジェクトの破棄
この動作の説明は次のとおりです。 C の一時オブジェクトの規則。一時オブジェクトは、不必要なコピーを避けるためにコンパイラによって暗黙的に作成されるオブジェクトです。あなたの場合、getString() によって作成された一時文字列は一時オブジェクトです。
一時オブジェクトは、作成された完全な式の終了時に破棄されます。完全な式は、他の式の部分式ではない式です。あなたの例では、行 const char* cStr = getString().c_str();は完全な表現です。したがって、getString() によって作成された一時文字列は、この行の最後で破棄されます。
問題の回避
この問題を回避するには、いくつかのオプションがあります。
これらのガイドラインに従うことで、ダングリング ポインタに関連する問題を回避し、コードが正しく動作することを保証できます。
以上が## C で文字列を返す関数で `std::string.c_str()` を使用すると失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。