[英]wchar_t pointer
這有什么問題:
wchar_t * t = new wchar_t;
t = "Tony";
我以為我可以使用wchar_t指針作為字符串...
您的代碼有兩個問題。
首先, "Tony"
是指向一串char
的指針。 L"Tony"
是合適的寬弦。
其次,你通過new分配一個wchar_t
,然后通過將指針重新分配給Tony立即失去對它的跟蹤。 這會導致內存泄漏。
指針只指向一個值。 這個很重要。
你所做的就是為一個wchar_t
分配空間,然后指向它。 然后嘗試將指針設置為指向字符串(請記住,只是在第一個字符處),但字符串類型不正確。
你擁有的是一串char
,它“應該”是L"Tony"
。 但是你在這里所做的就是泄漏你之前的內存分配,因為指針保存了一個新值。
而是想要分配足夠的空間來容納整個字符串,然后將字符串復制到分配的內存中。 但這是一種可怕的做法; 永遠不要做任何讓你需要明確釋放內存的東西。
只需使用std::wstring
並繼續前進。 std::wstring t = L"Tony";
。 它處理所有細節,您不必擔心清理任何東西。
既然你是C#開發人員,我會指出c ++做的一些不同的事情。
這會分配一個新的wchar_t並將其分配給t
wchar_t* t = new wchar_t
這是一個常量char數組
"Tony"
要獲得一個常量的wchar_t數組前綴,用L表示
L"Tony"
這將重新指向t指向常量L“Tony”而不是舊的wchar_t並導致內存泄漏,因為wchar_t永遠不會被釋放。
t = L"Tony"
這會創建一個寬字符串(wchar_t)來保存L“Tony”的副本
std::wstring t = L"Tony"
我想最后一行是你想要的。 如果需要訪問wchar_t指針,請使用t.c_str()。 請注意,c ++字符串是可變的,並在每個賦值中復制。
這樣做的方法是
const wchar_t* t = L"Tony"
這不會創建副本,只會指定指向const wchar數組的指針
這樣做首先將指向新分配的wchar_t
的指針分配給t
,然后嘗試將非寬字符串分配給t
。
你能用std::wstring
嗎? 這將滿足您的所有內存管理需求。
你可以,它只是“Tony”是一個硬編碼的字符串,並且在大多數編輯器/編譯器中它們默認為ANSI。 如果您想告訴編輯器您輸入的是Unicode字符串,請在其前面加上L,例如t = L"Tony"
。
你的代碼有其他問題,你的分配是分配一個Unicode字符(2個字節),然后你試圖將原始變量指向常量字符串,從而泄漏這2個字節。
如果要創建Unicode數據的緩沖區並將數據放入其中,您需要執行以下操作:
wchar_t* t = new wchar_t[500];
wcscpy(t, "Tony");
這是完全錯誤的。 不需要分配兩個字節,使t指向它們,然后覆蓋指針t永遠泄漏丟失的內存。
此外,“托尼”有不同的類型。 使用:
wchar_t *t = L"Tony";
恕我直言最好不要使用wchars - 請參閱https://stackoverflow.com/questions/1049947/should-utf-16-be-considered-harmful
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.