从函数返回后的std :: string c_str()范围

时间:2013-10-08 09:46:00

标签: c++ visual-studio-2010 visual-c++ mfc object-lifetime

我在C ++ / MFC中有下面提到的功能:

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

    return abc.c_str();

}

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

    Use_Temp(Temp);
}

1。)StringFunc()返回的abc.c_str()指针的生命周期是什么,在StringFunc()返回后是否可以安全地复制到变量'Temp'?

2.。)CString Temp = StringFunc()是浅拷贝操作还是深拷贝?

4 个答案:

答案 0 :(得分:3)

  

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

  

CString Temp = StringFunc()是浅拷贝操作还是深拷贝?

这是深刻的副本。它从CString

构造一个新的const char*对象

答案 1 :(得分:2)

Ad.1) - 你没有返回一个char指针,你正在返回一个从该指针隐式构造的CString实例。 CString获取传递的字符数据的副本。

Ad.2) - 复制或指定CString会创建深层副本。

答案 2 :(得分:0)

是的,内存被安全地复制到函数返回的Cstring对象中。这是一个深刻的副本。 Even the documentation says so

  

因为构造函数将输入数据复制到新分配的   存储,您应该知道可能会导致内存异常。

答案 3 :(得分:0)

1。):char const *返回的c_str()的生命周期只有控制流在函数StringFunc内,因为字符串变量abc将在该功能结束时销毁。但是,由于您按值返回CString,因此从c_str()的结果隐式构造临时,并返回CString;这个临时返回值依次有效,直到函数调用出现的表达式结束(即将函数StringFunc的结果赋给temp的整个语句)。因此,StringFunc的结果会安全地复制到Temp中的main变量中。

2。)这是一个“深层”副本,你在那里构建一个新对象!由于您按值返回,您的编译器最有可能实际上避免复制任何内容(请参阅Return-Value optimization),而只是构造一个对象。