Я создаю динамический массив LPCWSTR и хочу присвоить значения во время выполнения.
У меня есть следующий код:
cin>>count
LPCWSTR * lpwcstrArray = new LPCWSTR[count]();
for (int i = 0; i < count; i++)
{
// some logic to create different wstring on each iteration
wstring tempWString = L"somerandomstuff";
lpwcstrArray[i] = reinterpret_cast<LPSWSTR>tempWString.c_str();
}
Теперь, если я обращаюсь к lpwcstrArray — все индексы указывают на данные последней назначенной строки.
Я знаю, что это не правильный способ присвоения значений, но я не знаю правильный путь.
Вы храните указатели, которые указывают на внутренние временный 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;
В зависимости от того, чего вы на самом деле пытаетесь достичь, может быть безопаснее что-то вроде следующего, по крайней мере, если вам нужен только доступ к строкам только для чтения (что вы, вероятно, делаете, как 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...
wstring tempWString
создается и уничтожается с каждой итерацией цикла.
У вас есть висячие указатели в вашем lpwcstrArray
и испытывают неопределенное поведение при доступе к одному из них.
Вы должны выделить место самостоятельно или использовать std::wstring
в качестве типа массива вместо LPCWSTR
,
Попробуйте подход
std::wstring ws(_T("Hello"));
LPCTSTR lps= (LPCTSTR)(ws.c_str());
TRACE(lps);
Заметки:
Вы не должны использовать типы W напрямую (например: LPCWSTR
). Вместо этого используйте типы T (например: LPCTSTR
). Зачем? Потому что они будут автоматически переведены на версию, которую они должны быть (LPCSTR
для не-Unicode / ASCII; LPCWSTR
для Unicode), в зависимости от вашего проекта.
По той же причине вы должны окружить свои струны _T()
или предшествовать им с L
,
Попробуйте углубиться, используя «Перейти к определению», последовательно начиная с LPCTSTR
Смотрите также документацию по функции _tcscpy_s.