C 関数の暗黙的な戻りについて
C では、文字列リテラルを関数に渡すと、コンパイラはそれを暗黙的に文字列リテラルに変換します。 std::string オブジェクト。ただし、次の例では、std::string 関数から C スタイルの文字列リテラルを返します。
std::string myFunction() {
return "it's me!!";
}
ここで暗黙的に呼び出される std::string コンストラクターは文字列リテラルのコピーを作成するため、これは懸念を引き起こします。関数が返されると、このコピーの割り当てが解除され、ダングリング ポインタが残る必要があります。
c_str() を呼び出すと何が起こるか?
ただし、myFunction() を呼び出します。 c_str() は、std::string オブジェクトに格納されているデータへのポインタを返します。このポインタは、std::string オブジェクトの割り当てが解除された後でも、文字列リテラルを保持していた同じメモリを指します。
なぜこれが機能するのか (一種)
このコードが機能するように見える理由は、オペレーティング システムのメモリ管理の癖によるものです。メモリ ブロックの割り当てが解除されても、OS は必ずしもその内容をクリアするとは限りません。これは、技術的には到達不可能であっても、文字列リテラルのデータがメモリ内にまだ存在していることを意味します。
未定義の動作と幸運
この動作は未定義であることに注意することが重要ですC規格に準拠しています。これは、クラッシュや不正な結果など、あらゆることが発生する可能性があることを意味します。場合によっては、適切な C の実践ではなく、OS の実装の詳細によって機能することがあります。
したがって、この動作に依存することを避け、C コード内でデータが正しく割り当てられ、割り当て解除されていることを常に確認することが重要です。 .
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3