Я пишу код, и большая его часть требует возврата массивов wchar. Возвращение wstrings на самом деле не вариант (хотя я могу их использовать), и я знаю, что могу передать указатель в качестве аргумента и заполнить его, но я специально ищу, чтобы вернуть указатель на этот массив широких символов. Первые несколько итераций я обнаружил, что я вернул бы массивы в порядке, но к тому времени, когда они будут обработаны и напечатаны, память будет перезаписана, и у меня останется бред. Чтобы исправить это, я начал использовать 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;
}
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>
Примечание: вам также может потребоваться перейти на wcout
вместо cout
Поскольку вы пометили свой вопрос как «C ++», ответ звучит громко: нет, вы не должны использовать wcsdup
совсем. Вместо этого для передачи массивов wchar_t
ценности вокруг, используйте std::vector<wchar_t>
,
При необходимости вы можете превратить их в wchar_t*
взяв адрес первого элемента (поскольку векторы гарантированно сохраняются в непрерывной памяти), например,
cout << "12345 in Hex is " << &hexConversion[0] << endl;