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()が返す値が指すメモリを管理していることを覚えておいてください)
- 上記のコードが安全でない場合、それはなぜ安全ではないのですか?それは関数呼び出しを行うときに一時変数を追加するよりですか?それが安全ならば、なぜですか?コピーの
私はちょうどこれをコンパイルし、それは働いた。 ForEveRの答えによれば、それもうまくいくはずです。 –
@ H2CO3、 "それは働いた"何も証明することはありません - 時々あなたは幸運を得る。あなたがそれを試して、それが*働かなかったら、それは違うでしょう。 –
@ MarkRansomは、「ForEveRの答えによれば、それもうまくいくはずだ」と気付いた? (明確にするために:私はそれを知っています) –