来自 std::wstring 的 Asisgn LPCWSTR 数组

Asisgn LPCWSTR array from 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 - 所有索引都指向分配的最后一个字符串的数据。

我知道这不是正确的赋值方式,但我不知道正确的方式。

wstring tempWString 在循环的每次迭代中创建和销毁。
您的 lpwcstrArray 中有悬空指针,并且在访问其中一个指针时遇到未定义的行为。
您需要自己分配 space 或使用 std::wstring 作为数组类型而不是 LPCWSTR.

您正在存储指向 临时 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;

根据你真正想要完成的事情,更像下面的东西会更安全,至少如果你只需要只读访问字符串(你可能会这样做,因为 CLPCWSTR 中代表 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...

试试这个方法

    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

  • 开始连续使用 "Go To Definition" 尝试深入研究
  • 另请参阅 _tcscpy_s 函数文档