【发布时间】:2011-01-06 22:08:33
【问题描述】:
假设您有一个全局类(例如,可用于应用程序的运行时)
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 可以使用之前从内存中消失了。 有时它会打印 value: hello 其他时候它会崩溃或什么也不打印。
如果我首先像这样复制字符串
std::string copiedString = v1.value();
printf("value: %s\n", copiedString.c_str());
事情确实有效。
肯定有办法避免使用临时字符串进行此操作。
编辑:所以共识是使用 const std::string 和返回值。
我知道每个人都说原始代码应该没问题,但我可以告诉你,我已经看到 Windows CE 上的 MSVC 2005 遇到了问题,但只是在 CE 盒子上。不是 Win32 交叉编译。
【问题讨论】:
-
你能发布一个可编译的例子吗?对,我不明白你所经历的事情是如何发生的。
-
临时的
v1.value()应该一直存在到完整表达式的末尾,即它不应该在printf返回之前被销毁。 -
12.2 [class.temporary] / 5 表示“临时对象在评估完整表达式 (1.9) 的最后一步时被销毁,该完整表达式 (1.9) 包含它们的创建点。”跨度>
-
@user566129: 如果你的代码是 char const* s = v1.value().c_str(); printf("%s", s);,那么你可以看到你描述的行为。发帖的时候有没有不小心改了意思? (这就是为什么完整的、可编译的示例如此重要的原因之一。)
-
我注意到 WinCE 的编译器在其他方面不符合标准。不幸的是,如果这是一个编译器错误,我不会完全感到惊讶。
标签: c++ return-value stdstring