来自std :: wstring的Asisgn LPCWSTR数组

时间:2015-07-09 22:07:05

标签: c++ arrays std wstring lpcwstr

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

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

3 个答案:

答案 0 :(得分:3)

每次迭代循环都会创建和销毁

wstring tempWString 您在lpwcstrArray中有悬空指针,当您访问其中一个时,它们会遇到未定义的行为。
您需要自己分配空间或使用std::wstring作为数组类型而不是LPCWSTR

答案 1 :(得分: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;

根据您真正想要完成的内容,更像下面的内容会更安全,至少如果您只需要对字符串进行只读访问(您可能会这样做,因为C在{ {1}}代表LPCWSTR,因此数组的用户不会修改它们:

const

答案 2 :(得分:-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开始,继续深入使用“Go To Definition”

  • 另请参阅_tcscpy_s功能文档