У меня есть ниже упомянутая функция в C ++ / MFC:
CString StringFunc()
{
std::string abc = "Hello";
return abc.c_str();
}
int main()
{
CString Temp = StringFunc();
Use_Temp(Temp);
}
1.) Каков будет срок жизни указателя abc.c_str (), возвращаемого StringFunc (), будет ли он безопасно скопирован в переменную ‘Temp’ после возврата StringFunc ()?
2.) CString Temp = StringFunc () — это операция мелкого копирования или глубокое копирование?
Каков будет срок действия указателя abc.c_str (), возвращаемого StringFunc (), будет ли он безопасно скопирован в переменную «Temp» после возврата StringFunc ()?
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*
Ad.1) — Вы не возвращаете указатель на символ, вы возвращаете экземпляр CString
неявно построен из этого указателя. CString
берет копию переданных символьных данных.
Ad.2) — Копирование или назначение CString
создает глубокую копию.
Да, память безопасно копируется в Cstring
объект, возвращенный из функции. Это глубокая копия. Даже в документации так сказано:
Потому что конструкторы скопировать входные данные в новые выделенные
место хранения, Вы должны знать, что могут возникнуть исключения памяти.
1.): время жизни char const *
вернулся c_str()
только до тех пор, пока поток управления находится внутри функции StringFunc
, поскольку строковая переменная abc
будет уничтожен в конце этой функции. Однако, так как вы возвращаете CString по значению, временный объект неявно создается из результата c_str()
и что CString возвращается; это временное возвращаемое значение, в свою очередь, действует до конца выражения, в котором появляется вызов функции (то есть весь оператор, в котором вы присваиваете результат функции StringFunc
временно). Результат от вашего StringFunc
Поэтому безопасно копируется в ваш Temp
переменная в main
,
2.) Это «глубокая» копия, вы создаете там новый объект! Поскольку вы возвращаете по значению, ваш компилятор, по всей вероятности, фактически не будет ничего копировать (см. Оптимизация возврата) и вместо этого просто создаст один объект.