2010-12-07 20 views
4

爲了傳遞一個整數值給SetWindowTextW(),(我正在使用一個unicode構建,用C++和Visual Studio 2010),這個函數是否會返回一個LPCWSTR?我很確定這裏有些東西我不理解,因爲它會返回一個奇怪的值。我知道一個LPCWSTR是一個空終止的長指針寬字符字符串,但我仍然認爲我錯過了一些東西!?從函數返回LPCWSTR?

const LPCWSTR int2LPCWSTR (int integer) 
{ 
wstringstream wss; 
wss << integer; 
const wstring& wstr = wss.str(); 
const LPCWSTR p = wstr.c_str(); 
return p; 
} 

回答

8

有沒有錯,本身從函數返回一個LPCWSTR。出現的一般問題是圍繞返回值的內存管理。 A LPCWSTR通常保存在分配的內存中,因此需要在調用者和被調用者之間理解該內存的所有權。

我不想挑選您的示例,但它是返回LPCWSTR時出錯的一個很好的示例。該字符串的內存由該函數本地的wss實例保存。只要函數返回,內存在wss的析構函數中被釋放,並因此使返回值無效。

如果您已經在使用C++,我的建議是直接返回std::stringwstring以消除關於誰擁有分配內存的混淆。

或者,如果複製周圍的值是值得關注的問題,則通過引用返回。

void int2LPCWSTR (int integer, wstring& value) 
{ 
wstringstream wss; 
wss << integer; 
value = wss.str(); 
} 
0

.c_str()返回值是由wstr擁有。當wstr在函數結束時被破壞時,p變爲無效指針。

0

LPCWSTR指針到一堆wchar_t s。您將返回一個指向局部變量的指針(wss) - 函數返回後不存在的變量。因此,你的指針意味着什麼,並指向垃圾。

您應該返回std::wstring,因爲它包含字符串數據,而不僅僅是一個指針。

喜歡的東西:

std::wstring int2LPCWSTR (int integer) 
{ 
wstringstream wss; 
wss << integer; 
return wss.str(); 
} 

[編輯]雖然我個人西門Mourier建議做到這一點使用_itow()因爲性能原因。

+0

那麼我怎麼能修改它來返回一個wstring?可以將這個值傳遞給SetWindowTextW(),還是需要獲取.c_str()? – rem45acp 2010-12-07 17:41:09

+0

你可以使用我粘貼的功能。並且你是正確的 - 那麼就採取該返回值的.c_str()。一般來說,由於std :: string/std :: wstring抽象了字符串的所有內存管理,所以在代碼中默認使用它們,並且只處理。處理無法處理std :: string的外部內容時,使用c_str()或c-style字符串。 – tenfour 2010-12-07 17:44:05

2

你不能。
返回wstring的,然後用c_str()得到LPCWSTR,並把它傳遞給SetWindowTextW

0
LPWSTR int2LPCWSTR(const int & v) 
{ 
    LPWSTR buffer = new wchar_t[100]; 
    _itow_s(v, buffer, 100, 10); 
    return buffer; 
}