2015-08-28 189 views
2

我在寫代碼,它的很大一部分需要返回wchar數組。返回wstrings不是一個真正的選擇(雖然我可以使用它們),我知道我可以傳遞一個指針作爲參數並填充它,但是我特別想要返回一個指向這個寬字符數組的指針。最初的幾次迭代中,我發現我會返回數組,但在處理和打印時,內存將被覆蓋,而我將留下亂碼。爲了解決這個問題,我開始使用wcsdup,它固定了所有的東西,但是我正努力去準確地掌握正在發生的事情,因此,它應該被調用以便它能夠正常工作,而且我不會泄漏任何內存。實際上,每次我返回一個字符串時,我幾乎都會使用wcsdup,並且每次返回一個字符串時,我都知道會泄漏內存。這是我正在做的。我在哪裏以及爲什麼要使用wcsdup,或者有沒有比wcsdup更好的解決方案?你如何最好地利用wcsdup?

wchar_t *intToWChar(int toConvert, int base) 
{ 
    wchar_t converted[12]; 
    /* Conversion happens... */ 
    return converted; 
} 

wchar_t *intToHexWChar(int toConvert) 
{ 
    /* Largest int is 8 hex digits, plus "0x", plus /0 is 11 characters. */ 
    wchar_t converted[11]; 

    /* Prefix with "0x" for hex string. */ 
    converted[0] = L'0'; 
    converted[1] = L'x'; 

    /* Populate the rest of converted with the number in hex. */ 
    wchar_t *hexString = intToWChar(toConvert, 16); 
    wcscpy((converted + 2), hexString); 

    return converted; 
} 

int main() 
{ 
    wchar_t *hexConversion = intToHexWChar(12345); 
    /* Other code. */ 

    /* Without wcsdup calls, this spits out gibberish. */ 
    wcout << "12345 in Hex is " << hexConversion << endl; 
} 
+0

「intToWChar」和「intToHexWChar」均返回指向函數完成後超出範圍的變量的指針。不要這樣做。 – crashmstr

+0

你不需要[wcout](http://stackoverflow.com/questions/2493785/how-i-can-print-the-wchar-t-values-to-console)嗎? – crashmstr

+0

爲什麼你不能只返回一個std :: wstring而不是原始指針? – paulm

回答

0
wchar_t *intToWChar(int toConvert, int base) 
{ 
    wchar_t converted[12]; 
    /* Conversion happens... */ 
    return converted; 
} 

這將一指針返回到局部變量。

wchar_t *hexString = intToWChar(toConvert, 16); 

這條線後,hexString將指向無效的內存,並使用它是不確定的(可能還有價值或可能是垃圾!)。

您可以從intToHexWChar返回相同的結果。

解決方案:

  • 使用std::wstring
  • 使用std::vector<wchar_t>
  • 通以陣列的功能爲使用
  • 使用智能指針
  • 使用動態存儲器分配(請不要」 t!)

注意:您可能還需要更改爲wcout而不是cout

+0

好吧,現在讓我添加一個抽象級別。通常情況下,這些字符串/字符數組將被存儲在結構中,以便以後使用myStruct.GetString()進行檢索。我意識到我不能真正保持一個指向結構中的char數組的指針,並期望內存不受影響,但是wstring不會使這個變量的大小變成結構,如果是這樣,那不是很糟糕嗎? – TMenninger

+0

唯一的問題是如果你正在編寫二進制數據,並期望有一個固定大小的記錄。我會冒險猜測,現代C++中的大多數實際數據不是固定大小,而是包含'std :: string'以及標準容器類(它們也具有可變大小)。就你的問題而言,我認爲這是一個很好的答案。但既然你沒有給我們真正的用法,我不知道我們可以更好地回答。 – crashmstr

0

既然你標記你的問題「C++」的答案是響亮的:不,你不應該使用wcsdup在所有。相反,要傳遞wchar_t值的數組,請使用std::vector<wchar_t>

如果需要,可以通過獲取第一個元素的地址(因爲矢量保證存儲在連續的存儲器中),例如,將這些變成wchar_t*

cout << "12345 in Hex is " << &hexConversion[0] << endl; 
+0

或在C++ 11中使用std :: vector :: data(如果vec爲空,將避免任何問題) – paulm