我在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()是浅拷贝操作还是深拷贝?
答案 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),而只是构造一个对象。