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