我正在创建一个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 - 所有索引都指向分配的最后一个字符串的数据。
我知道这不是分配值的正确方法,但我不知道正确的方法。
答案 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功能文档