来自 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;
根据你真正想要完成的事情,更像下面的东西会更安全,至少如果你只需要只读访问字符串(你可能会这样做,因为 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...
试试这个方法
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 函数文档
我正在创建 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;
根据你真正想要完成的事情,更像下面的东西会更安全,至少如果你只需要只读访问字符串(你可能会这样做,因为 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...
试试这个方法
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 函数文档