簡體   English   中英

wchar_t指針

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM