可能重复:
临时工的生命周期
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() 返回值指向的内存...)
- 如果上面的代码不安全,为什么不安全?有没有比在函数调用时添加临时变量更好、同样简洁的方法来编写它?如果安全,为什么?