1

我在 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

4 回答 4

4

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() 是浅拷贝操作还是深拷贝?

是深拷贝。它CStringconst char*

于 2013-10-08T09:52:22.520 回答
2

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

Ad.2) - 复制或分配 aCString创建一个深层副本。

于 2013-10-08T09:52:30.917 回答
0

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

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

于 2013-10-08T09:53:01.623 回答
0

是的,内存被安全地复制到Cstring函数返回的对象中。这是一个深拷贝。甚至文档也这么说

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

于 2013-10-08T09:51:34.060 回答