从函数返回后的 std::string c_str() 作用域

Win*_*mer 2 c++ mfc visual-studio-2010 object-lifetime visual-c++

我在 C++/MFC 中有下面提到的函数:

CString StringFunc()
{
    std::string abc = "Hello";

    return abc.c_str();

}

int main()
{
    CString Temp = StringFunc();

    Use_Temp(Temp);
}
Run Code Online (Sandbox Code Playgroud)

1.) StringFunc() 返回的 abc.c_str() 指针的生命周期是多少,在 StringFunc() 返回后它会安全地复制到变量“Temp”吗?

2.) CString Temp = StringFunc() 是浅复制操作还是深复制?

bil*_*llz 5

StringFunc() 返回的 abc.c_str() 指针的生命周期是多少,在 StringFunc() 返回后它会安全地复制到变量“Temp”吗?

abc直到返回为止都有效StringFunc() function。是的,将副本返回到 CString 是安全的。

如果你返回一个指针,std::string::c_str()那么这是危险的,例如:

const char* EvilFunc()  // bad, dont' do it
{
   std::string abc = "Hello";
   return abc.c_str();
}

const char* p = EvilFunc(); // p becomes wild pointer when EvilFunc returns
Run Code Online (Sandbox Code Playgroud)

CString Temp = StringFunc() 是浅复制操作还是深复制?

这是深度复制。它构造一个新CString对象const char*

  • 如何使 EvilFunc 成为一款优秀的 EvilFunc?我有同样的情况,coverity 工具在 c_str() 返回时报告一些问题。 (3认同)