std::string.c_str() の無効化 戻り値
C では、次から派生した定数文字ポインタ (char*) を返します。 c_str() メソッドを使用する std::string のインスタンスは潜在的な問題を引き起こします。これにより、std::string オブジェクトが破棄されるとポインターが無効になるため、未定義の動作が発生する可能性があります。
次の例を考えてみましょう。
const char* returnCharPtr() { std::string someString; // Some processing! return someString.c_str(); }
このコードでは、std: someString という名前の :string オブジェクトが関数内でローカルに作成されます。何らかの処理の後、その内部文字配列は c_str() メソッドを介してアクセスされ、この配列へのポインターが返されます。
ただし、関数のスコープが終了すると、someString は破棄され、割り当てられたメモリが解放されます。その結果、c_str() によって返されるポインタは、有効ではなくなったメモリを指すダングリング ポインタになります。
解決策
この問題を回避するには、次のようにします。いくつかのアプローチが考えられます:
例
std::string 戻り値の型の使用:
std::string returnString() { std::string someString("something"); return someString; }
この関数は文字列の有効なコピーを返すようになり、潜在的なダングリングを回避しますポインタ。
以上が`std::string.c_str()` を返すのはなぜ危険なのでしょうか?また、未定義の動作を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。