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
ただし、クラスによって管理される文字列がメモリ内で再配置されることはないと想定しているため、これは依然として危険です。たとえば、ベクトルを拡張する必要があるとすぐに thenStringManager
を使用して が実装されている場合std::vector
、以前の内容がより大きなメモリ ブロックの別の場所にコピーされ、存在しないオブジェクトへの参照を保持することになります。
つまり、内部データへのハンドルを返さないようにします。