C 関数の暗黙的な Return を理解する
C では、文字列リテラルを関数に渡すと、コンパイラはそれを暗黙的に文字列リテラルに変換します。 std::string オブジェクト。ただし、次の例では、std::string 関数から C スタイルの文字列リテラルを返します。
<code class="cpp">std::string myFunction() { return "it's me!!"; }</code>
これは、ここで暗黙的に呼び出される std::string コンストラクターによって次のコピーが作成されるため、懸念が生じます。文字列リテラル。関数が返されると、このコピーの割り当てが解除され、ダングリング ポインタが残る必要があります。
c_str() を呼び出すと何が起こりますか?
ただし、myFunction() を呼び出します。 c_str() は、std::string オブジェクトに格納されているデータへのポインタを返します。このポインタは、std::string オブジェクトの割り当てが解除された後でも、文字列リテラルを保持していた同じメモリを指します。
これが機能する理由 (一種)
このコードが機能するように見える理由は、オペレーティング システムのメモリ管理の癖によるものです。メモリ ブロックの割り当てが解除されても、OS は必ずしもその内容をクリアするとは限りません。これは、技術的には到達不可能であっても、文字列リテラルのデータがメモリ内にまだ存在していることを意味します。
未定義の動作と運
この動作は未定義であることに注意することが重要です。 C規格に準拠しています。これは、クラッシュや不正な結果など、あらゆることが発生する可能性があることを意味します。場合によっては、適切な C の実践のためではなく、OS の実装の詳細によって機能することがあります。
したがって、この動作に依存することを避け、C コード内でデータが正しく割り当てられ、割り当て解除されていることを常に確認することが重要です。 .
以上がこの場合、なぜ `c_str()` が割り当て解除された `std::string` で機能するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。