2016-12-20 4 views
1

は、私は(例としてのみ使用し、ブースト::ファイルシステムで)このパターンの複数のインスタンスに遭遇しましたこのパターンで問題が発生したことは一度もありませんが、sting()によって返された文字列が破棄され、c_str()にアクセスするコードがc_str() lifetime is bound to std::string lifetimeとして安全かどうかが疑問でした。返される文字列の生涯とその.c_strは()

+0

なぜCの質問としてタグ付けされていますか? – wasthishelpful

+0

それにはc_str()があるので – PhilLab

+2

@PhilLab:それはCでコンパイルすることを意味しません;-) – Bathsheba

答えて

2

someFunctionTakingCStrings(path.string().c_str());標準では、匿名のテンポラリpath.string()の存続期間が関数呼び出しを引き継ぐことが保証されているため、安全です。したがって、c_str()によって返されたポインタはsomeFunctionTakingCStringsの有効なパラメータです。概念的には、あなたがtmpの値のコピーを返却され、以来、実際には、コンパイラは、値のコピー(名前付き戻り値の最適化と呼ばれる処理)を行う最適化しますが、

const std::string path::string() constは、安全です。

(参照をぶら下げるなるので)あなたが定義されていないだろうしているものと同じ関数本体とconst std::string& path::string() constような何か、とsが外にあるとして

const char* ub_server() 
{ 
    std::string s = "Hello"; 
    return s.c_str(); 
} 

は、また、定義されていませんスコープは、関数が戻るまでの時間です。

最後に、関数呼び出しのパラメータとして匿名の一時的なポインタへのポインタをとることは、標準的なC++ではではなく、であることに注意してください。

+0

ありがとう。迅速なフォローアップ:したがって、 '' functionTakingPointer(&path.string()) ''も安全でしょうか? – PhilLab

+0

@PhilLab:いいえ、標準のC++では安全ではありません。私は答えの最後にそれを置いた。 – Bathsheba

+0

hmの場合、path.string()の存続期間を完全に理解できませんでした。または、匿名の一時的なものは、メモリ管理に関する自分自身の全体の章ですか? – PhilLab

関連する問題