std::wstring originalString;
- это локальная переменная внутри тела вашей GetWCharTStar
функции.
Как только вы выходите из области действия функции GetWCharTStar()
, эта локальная переменная уничтожается, и возвращаемый вами указатель становится недействительным.
Следующий код может в конечном итоге работать:
const wchar_t *StringManager::GetWCharTStar(int stringId)
{
const std::wstring& originalString = StringManager::GetString(stringId);
const wchar_t *retStr = originalString.c_str();
return retStr;
}
При условии StringManager::GetString()
возвращает ссылку:
const std::wstring& StringManager::GetString(int stringId);
Однако это все еще рискованно, поскольку предполагается, что строки, управляемые вашим классом StringManager
, никогда не будут перемещены в память. Например, если StringManager
реализован с помощью std::vector
, тогда, как только вектору потребуется расширить, его предыдущее содержимое копируется в другое место в более крупном блоке памяти, и вы в конечном итоге удерживаете ссылку на объект, который там больше нет.
Другими словами, избегать возврата дескрипторов внутренних данных .