2012-04-04 11 views
45

を一時には、次のC++のコードだけでなく、形成されています。 c_str()ポインタは、何もstd :: stringオブジェクトが破壊されるのを防ぎません(あるいは、私は間違っていますか?)。コードがすべてであっても問題ないのであれば、私は標準に目を向けることができますか? g ++でテストするとうまくいきます。のstd ::文字列:: c_str()と

答えて

56

std::string::c_str()によって返されたポインタは、文字列オブジェクトによって維持されるメモリ を指します。文字列オブジェクトに対して非const 関数が呼び出されるか、または文字列オブジェクトが破棄されて になるまで有効です。あなたが懸念している文字列オブジェクトは一時的なものです。 完全な式の終わりに、前にではなく、 の後に破棄されます。あなたの場合、完全な式の最後はconsumerへの の呼び出しの後にあるので、あなたのコードは安全です。 consumer が後で使用するという考えで、どこかにポインタを保存していないとしません。

一時オブジェクトの存続期間は、C++ 98以降で厳密に定義されています。 コンパイラによって異なりますが、 のコードはg ++で動作しませんでした(1995年以前、おおよそ— g ++ が標準委員会で投票した直後にこれを変更しました)。 (std::stringが存在しませんでしたが、同じ問題が ユーザ文字列クラスに影響します)

18

一時的std::stringの寿命はちょうどどこconsumerリターンポイントを越えて延びているので、consumer内から直接その文字列上のものを使用しても安全です。 ではない OKは、c_strが返す値を保存し、後で使用しようとします(一時的なものが破棄され、ポインタの他端で何が見つかるかわかります)。

+1

C++ 03またはC++ 11標準に関するヒントを教えてください。 – user1095108

+3

一時的なライフタイムは§12.2で定義されています。 (セクション12は という名前の「特別なメンバー関数」ですが、 が一時的なものの寿命を期待しているわけではありませんが、その場所はここにあります) –

+0

@ user1095108と関数引数の存続期間は§ C++ 03標準の3.2.2および§3.7.2。 – juanchopanza

5

random_string_generator()関数によって返された一時的要素は、consumer()関数で安全に使用できます。

関連する問題