如何正确返回std :: string(或如何正确使用返回值)

Ron*_*Ron 8 c++ return-value stdstring

假设你有一个全局的类(例如可用于应用程序的运行时)

class MyClass {
  protected:
    std::string m_Value;
  public:
    MyClass () : m_Value("hello") {}
    std::string value() { return m_Value; }      
};

MyClass v1;
Run Code Online (Sandbox Code Playgroud)

当我这样做时,使用第一种形式给了我奇怪的行为

printf("value: %s\n", v1.value().c_str());
Run Code Online (Sandbox Code Playgroud)

看起来字符串在printf可以使用之前从内存中消失了.有时它打印值:hello其他时候它崩溃或什么都不打印.

如果我第一次复制字符串就像这样

   std::string copiedString = v1.value();
   printf("value: %s\n", copiedString.c_str());
Run Code Online (Sandbox Code Playgroud)

事情确实有效.

当然必须有一种方法可以避免使用临时字符串.

编辑:所以共识是使用const std :: string和返回值.

我知道每个人都说原始代码应该没问题,但我可以告诉你,我在Windows CE上看到MSVC 2005遇到了麻烦,但只能在CE盒子上.不是Win32交叉编译.

Lig*_*ica 6

你的代码应该工作正常.还有其他错误,我们无法从这个测试用例中检测到.也许通过valgrind运行您的可执行文件来搜索内存错误.


rub*_*nvb 1

嗯,代码没有任何问题(按照我的解释)。这不是最佳的,当然也不是最佳的The Right Way (R),您应该像 villentehaspam 建议的那样修改您的代码。就像现在一样,您的代码会复制字符串,m_value因为您按值返回,这不如仅返回 const 引用。

如果您提供显示问题的完整代码示例,我可以更好地帮助您。