2

我正在创建一个动态的 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 - 所有索引都指向分配的最后一个字符串的数据。

我知道这不是分配值的正确方法,但我不知道正确的方法。

4

3 回答 3

3

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

于 2015-07-09T22:13:33.580 回答
1

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

根据您真正想要完成的工作,更像以下内容会更安全,至少如果您只需要对字符串的只读访问权限(您可能会这样做,因为CinLPCWSTR代表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...
于 2015-07-09T23:44:18.893 回答
-1

尝试方法

    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 函数文档

于 2015-07-09T23:51:04.073 回答