假设你有一个类至极是一个全球性的(例如可以为应用程序的运行时)如何正确地返回的std :: string(或如何正确使用返回值)
class MyClass {
protected:
std::string m_Value;
public:
MyClass() : m_Value("hello") {}
std::string value() { return m_Value; }
};
MyClass v1;
使用第一形式给我奇怪的行为,当我做
printf("value: %s\n", v1.value().c_str());
它看起来好像字符串在printf可以使用它之前从内存中消失。 有时它会打印值:其他时候它会崩溃或不打印任何东西。
如果我先复制像这样
std::string copiedString = v1.value();
printf("value: %s\n", copiedString.c_str());
事情做的工作的字符串。
当然,必须有一种方法避免使用临时字符串来做到这一点。
编辑:所以共识是用const std :: string &返回值。
我知道每个人都说原始代码应该没问题,但我可以告诉你,我已经看到Windows CE上的MSVC 2005有问题,但只在CE盒子上。不是Win32交叉编译。
你可以发布一个可编译的例子吗?没错,我不明白你所遇到的情况会如何发生。 – Falmarri 2011-01-06 22:11:49
临时的`v1.value()`应该一直存在到完整表达式的末尾,即它不应该在`printf`返回之前被销毁。 – 2011-01-06 22:16:49
@Charles Bailey:真的吗?是不是只是评估从c_str()获得常规字符*? – villintehaspam 2011-01-06 22:20:28