一時 std::wstring
オブジェクトの内部を指すポインタを格納しています。これらのオブジェクトがループの反復ごとに破棄されると、配列にはポインタがぶら下がったままになります。代わりに、個々の文字列を動的に割り当てる必要があります。たとえば、次のようになります。
std::cin >> count
LPWSTR *lpwstrArray = new LPWSTR[count];
for (int i = 0; i < count; i++)
{
// some logic to create different wstring on each iteration
std::wstring tempWString = L"somerandomstuff";
LPWSTR str = new WCHAR[tempWString.length()+1];
const wchar_t *p = tempWString.c_str();
std::copy(p, p+tempWString.length(), str);
lpwstrArray[i] = str;
}
// use lpwstrArray as needed...
// don't forget to free the memory when you are done using it...
for (int i = 0; i < count; i++)
delete[] lpwstrArray[i];
delete[] lpwstrArray;
実際に達成しようとしていることに応じて、少なくとも文字列への読み取り専用アクセスが必要な場合は、次のような方が安全です ( in は を表すため、配列のユーザーはおそらくそうするでしょC
うLPCWSTR
) const
。それらを変更するつもりはありません):
std::cin >> count
std::vector<std::wstring> wstrArray(count);
for (int i = 0; i < count; i++)
{
// some logic to create different wstring on each iteration
wstrArray[i] = L"somerandomstuff";
}
std::vector<LPWSTR> lpwstrArray(count);
for (int i = 0; i < count; i++)
lpwstrArray[i] = const_cast<wchar_t*>(wstrArray[i].c_str());
// use lpwstrArray as needed. if you need to pass it where an
// LPWSTR* is expected, you can use &lpwstrArray[0] for that...
// lpwstrArray and wstrArray will be freed automatically
// when they go out of scope...