Область действия std :: string c_str () после возвращения из функции

У меня есть ниже упомянутая функция в 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 () — это операция мелкого копирования или глубокое копирование?

1

Решение

Каков будет срок действия указателя 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*

3

Другие решения

Ad.1) — Вы не возвращаете указатель на символ, вы возвращаете экземпляр CString неявно построен из этого указателя. CString берет копию переданных символьных данных.

Ad.2) — Копирование или назначение CString создает глубокую копию.

2

Да, память безопасно копируется в Cstring объект, возвращенный из функции. Это глубокая копия. Даже в документации так сказано:

Потому что конструкторы скопировать входные данные в новые выделенные
место хранения
, Вы должны знать, что могут возникнуть исключения памяти.

0

1.): время жизни char const * вернулся c_str() только до тех пор, пока поток управления находится внутри функции StringFunc, поскольку строковая переменная abc будет уничтожен в конце этой функции. Однако, так как вы возвращаете CString по значению, временный объект неявно создается из результата c_str()и что CString возвращается; это временное возвращаемое значение, в свою очередь, действует до конца выражения, в котором появляется вызов функции (то есть весь оператор, в котором вы присваиваете результат функции StringFunc временно). Результат от вашего StringFunc Поэтому безопасно копируется в ваш Temp переменная в main,

2.) Это «глубокая» копия, вы создаете там новый объект! Поскольку вы возвращаете по значению, ваш компилятор, по всей вероятности, фактически не будет ничего копировать (см. Оптимизация возврата) и вместо этого просто создаст один объект.

0
По вопросам рекламы [email protected]