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的回答,它也應該起作用。 – 2012-09-07 17:59:27
@ H2CO3,「它的工作」從來沒有證明任何東西 - 有時你只是幸運。如果你已經嘗試過它,它*不工作,那就會有所不同。 –
@MarkRansom注意到「它也應該工作,根據ForEveR的答案」部分? (澄清:我知道) – 2012-09-07 18:04:23