从函数返回LPCWSTR?

时间:2010-12-07 17:32:34

标签: c++ visual-studio-2010 unicode

为了将整数值传递给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;
}

6 个答案:

答案 0 :(得分:9)

从函数返回LPCWSTR本身没有错。然而,出现的一般问题是围绕返回值的内存管理。 LPCWSTR通常保存在已分配的内存中,因此需要在调用者和被调用者之间理解该内存的所有权。

我不想挑选你的样本,但这是一个很好的例子,说明返回LPCWSTR会出现什么问题。字符串的内存由函数本地的wss实例保存。一旦函数返回,内存就会在wss的析构函数中释放,从而使返回值无效。

如果您已经在使用C ++,我的推荐就是直接返回std::stringwstring,以消除对谁拥有已分配内存的疑惑。

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;
}
相关问题