Asisgn LPCWSTR массив из std :: wstring

Я создаю динамический массив 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 — все индексы указывают на данные последней назначенной строки.

Я знаю, что это не правильный способ присвоения значений, но я не знаю правильный путь.

2

Решение

Вы храните указатели, которые указывают на внутренние временный 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...
1

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

wstring tempWString создается и уничтожается с каждой итерацией цикла.
У вас есть висячие указатели в вашем lpwcstrArray и испытывают неопределенное поведение при доступе к одному из них.
Вы должны выделить место самостоятельно или использовать std::wstring в качестве типа массива вместо LPCWSTR,

3

Попробуйте подход

    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.

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