重複の可能性:
一時的なものの寿命
int LegacyFunction(const char *s) {
// do something with s, like print it to standard output
// this function does NOT retain any pointer to s after it returns.
return strlen(s);
}
std::string ModernFunction() {
// do something that returns a string
return "Hello";
}
LegacyFunction(ModernFunction().c_str());
上記の例は、文字列の代わりにスマートポインタを使用するように簡単に書き直すことができます。私はこれらの状況の両方に何度も遭遇しました。とにかく、上記の例では、ModernFunctionでSTL文字列を作成して返し、文字列オブジェクト内のCスタイルの文字列へのポインタを取得して、そのポインタをレガシー関数に渡します。
- ModernFunctionが戻った後に存在する一時的な文字列オブジェクトがあります。いつ範囲外になりますか?
- コンパイラがc_str()を呼び出し、この一時文字列オブジェクトを破棄してから、ダングリングポインタをLegacyFunctionに渡すことは可能ですか?(文字列オブジェクトは、c_str()の戻り値が指すメモリを管理していることに注意してください...)
- 上記のコードが安全でない場合、なぜ安全ではないのでしょうか。また、関数呼び出しを行うときに一時変数を追加するよりも、同じように簡潔な方法でコードを記述できるのでしょうか。安全だとしたら、なぜですか?