为了将整数值传递给SetWindowTextW(),(我在C ++中使用unicode构建,使用Visual Studio 2010),这个函数是否足以返回LPCWSTR?我很确定这里有一些我不理解的东西,因为它会返回一个奇怪的值。我知道LPCWSTR是一个空终止的长指针宽字符串,但我仍然认为我错过了一些东西!?
const LPCWSTR int2LPCWSTR ( int integer )
{
wstringstream wss;
wss << integer;
const wstring& wstr = wss.str();
const LPCWSTR p = wstr.c_str();
return p;
}
答案 0 :(得分:9)
从函数返回LPCWSTR
本身没有错。然而,出现的一般问题是围绕返回值的内存管理。 LPCWSTR
通常保存在已分配的内存中,因此需要在调用者和被调用者之间理解该内存的所有权。
我不想挑选你的样本,但这是一个很好的例子,说明返回LPCWSTR
会出现什么问题。字符串的内存由函数本地的wss
实例保存。一旦函数返回,内存就会在wss
的析构函数中释放,从而使返回值无效。
如果您已经在使用C ++,我的推荐就是直接返回std::string
或wstring
,以消除对谁拥有已分配内存的疑惑。
wstring int2LPCWSTR ( int integer )
{
wstringstream wss;
wss << integer;
return wss.str();
}
或者,如果复制值是一个问题,请通过引用返回。
void int2LPCWSTR ( int integer, wstring& value )
{
wstringstream wss;
wss << integer;
value = wss.str();
}
答案 1 :(得分:2)
你不能。
返回wstring,然后使用c_str()
获取LPCWSTR并将其传递给SetWindowTextW
答案 2 :(得分:0)
.c_str()
的返回值归wstr
所有。在函数结尾处wstr
被破坏时,p
将成为无效指针。
答案 3 :(得分:0)
LPCWSTR
是一堆wchar_t
的指针。您将返回一个指向局部变量(wss
)的指针 - 一个在函数返回后不存在的变量。因此,你的指针没有任何意义,并指向垃圾。
您应该返回std::wstring
,因为它包含字符串数据,而不仅仅是指针。
类似的东西:
std::wstring int2LPCWSTR ( int integer )
{
wstringstream wss;
wss << integer;
return wss.str();
}
[编辑]但是,我个人会因为性能原因使用_itow()来做这件事,正如Simon Mourier建议的那样。
答案 4 :(得分:0)
您应该使用_itoa, _i64toa, _ui64toa, _itow, _i64tow, _ui64tow 运行时提供的功能(如果担心安全性,则使用安全功能)。
答案 5 :(得分:0)
LPWSTR int2LPCWSTR(const int & v)
{
LPWSTR buffer = new wchar_t[100];
_itow_s(v, buffer, 100, 10);
return buffer;
}