を一時には、次のC++のコードだけでなく、形成されています。 c_str()ポインタは、何もstd :: stringオブジェクトが破壊されるのを防ぎません(あるいは、私は間違っていますか?)。コードがすべてであっても問題ないのであれば、私は標準に目を向けることができますか? g ++でテストするとうまくいきます。のstd ::文字列:: c_str()と
45
A
答えて
56
std::string::c_str()
によって返されたポインタは、文字列オブジェクトによって維持されるメモリ を指します。文字列オブジェクトに対して非const 関数が呼び出されるか、または文字列オブジェクトが破棄されて になるまで有効です。あなたが懸念している文字列オブジェクトは一時的なものです。 完全な式の終わりに、前にではなく、 の後に破棄されます。あなたの場合、完全な式の最後はconsumer
への の呼び出しの後にあるので、あなたのコードは安全です。 consumer
が後で使用するという考えで、どこかにポインタを保存していないとしません。
一時オブジェクトの存続期間は、C++ 98以降で厳密に定義されています。 コンパイラによって異なりますが、 のコードはg ++で動作しませんでした(1995年以前、おおよそ— g ++ が標準委員会で投票した直後にこれを変更しました)。 (std::string
が存在しませんでしたが、同じ問題が ユーザ文字列クラスに影響します)
18
一時的std::string
の寿命はちょうどどこconsumer
リターンポイントを越えて延びているので、consumer
内から直接その文字列上のものを使用しても安全です。 ではない OKは、c_str
が返す値を保存し、後で使用しようとします(一時的なものが破棄され、ポインタの他端で何が見つかるかわかります)。
5
random_string_generator()関数によって返された一時的要素は、consumer()関数で安全に使用できます。
関連する問題
- 1. のstd ::文字列:: c_str&ヌル終了
- 2. 返される文字列の生涯とその.c_strは()
- 3. のstd ::リスト<std::string> ::イテレータはstd ::文字列にする
- 4. C++ c_str文字列の末尾に奇妙な文字を追加する
- 5. キャストc_str()は短い文字列に対してのみ有効
- 6. std :: stringと文字列
- 7. 空文字列のc_strを呼び出す
- 8. std :: string :: c_strとstd :: string :: dataの違いは何ですか?
- 9. のstd ::文字列::長さ()はstd ::文字列対::サイズ()
- 10. 文字列リテラルが必要なときはいつでもstd :: string :: c_str()を使用できますか?
- 11. のstd ::文字列の文字参照
- 12. ブースト:: ASIO :: STDとasync_write ::文字列
- 13. パフォーマンスのstd :: STD対はstrstr ::文字列::
- 14. 文字列クラスのc_str()メソッドは何を返しますか?
- 15. は「のstd ::文字列」
- 16. visual studio 2008 sp1 std :: string :: c_str()エラー
- 17. c_str()は空文字列を返します
- 18. std :: string :: c_str()は常にNULLで終了する文字列を返しますか?
- 19. std :: stringとstd :: mapオペレーションがUnicode文字列にある
- 20. 大文字と小文字を区別しないstd ::文字列のセット
- 21. のstd ::文字列 - N3290より小さな文字列の最適化とスワップ
- 22. 使用してのstd :: find_if ::文字列
- 23. はCでのstd ::文字列をエンコード++
- 24. .NET System :: std :: stringへの文字列
- 25. 塗りつぶしのstd ::文字列
- 26. std :: ostringstreamが有効な文字列を返さない
- 27. C++文字列
- 28. は高速STDから/へのstd ::クロノ:: time_point変換::文字列
- 29. std :: wstringとstd :: stringの間のUTF-8エンコード文字列の処理
- 30. C++ ostringstream.str()。c_str()
C++ 03またはC++ 11標準に関するヒントを教えてください。 – user1095108
一時的なライフタイムは§12.2で定義されています。 (セクション12は という名前の「特別なメンバー関数」ですが、 が一時的なものの寿命を期待しているわけではありませんが、その場所はここにあります) –
@ user1095108と関数引数の存続期間は§ C++ 03標準の3.2.2および§3.7.2。 – juanchopanza