ホームページ  >  記事  >  バックエンド開発  >  関数から返された割り当て解除された `std::string` で `c_str()` を呼び出すと、機能しているように見えるのに、実際には未定義の動作が発生するのはなぜですか?

関数から返された割り当て解除された `std::string` で `c_str()` を呼び出すと、機能しているように見えるのに、実際には未定義の動作が発生するのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-26 04:16:02929ブラウズ

Why Does Calling `c_str()` on a Deallocated `std::string` Returned from a Function Seem to Work, But Actually Leads to Undefined Behavior?

std::string 関数から C 文字列リテラルを返し、c_str() を呼び出すと未定義の動作が発生する可能性がある理由

最近の講義では、混乱を引き起こす C コードの断片に遭遇したことがあるかもしれません:

<code class="cpp">std::string myFunction() { return "it's me!!"; }

int main() {
  const char* tempString = myFunction().c_str();
  char myNewString[100] = "Who is it?? - ";
  strcat(myNewString, tempString);
  printf("The string: %s", myNewString);
}</code>

「return 'it's me!!'」が暗黙的に std::string コンストラクターを呼び出すため、このコードが失敗すると想定するのは理解できます。 const char[] を使用します。したがって、関数から返された std::string は、関数が返されるとすぐに割り当てが解除されます。しかし、驚くべきことに、コードは明らかな問題なく実行されます。

コードの分析は正確です。ここで示された動作は、未定義の動作の範疇に属します。このような場合、影響は大きく異なる可能性があります。この特定のインスタンスでは、文字列に割り当てられたメモリは、技術的に割り当てが解除されているにもかかわらず、アクセス時に元のデータを保持したままになります。この現象は、オペレーティング システムが割り当て解除されたメモリを自動的に消去せず、代わりに将来使用できるメモリとしてマークすることを選択するために頻繁に発生します。

ただし、メモリの割り当て解除の処理は C の責任ではないことに注意することが重要です。言語;これは、各オペレーティング システムの実装に特有の複雑な詳細です。 C の観点からは、包括的な「未定義の動作」が適用されます。したがって、そのような動作に依存することは、コード内で予測不可能で壊滅的な結果を招く可能性があるため、強くお勧めできません。

以上が関数から返された割り当て解除された `std::string` で `c_str()` を呼び出すと、機能しているように見えるのに、実際には未定義の動作が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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