Как лучше всего использовать wcsdup?

Я пишу код, и большая его часть требует возврата массивов 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;
}

2

Решение

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

0

Другие решения

Поскольку вы пометили свой вопрос как «C ++», ответ звучит громко: нет, вы не должны использовать wcsdup совсем. Вместо этого для передачи массивов wchar_t ценности вокруг, используйте std::vector<wchar_t>,

При необходимости вы можете превратить их в wchar_t* взяв адрес первого элемента (поскольку векторы гарантированно сохраняются в непрерывной памяти), например,

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

По вопросам рекламы [email protected]