возвращать LPCWSTR из функции? - PullRequest
4 голосов
/ 07 декабря 2010

Для того, чтобы передать целочисленное значение в SetWindowTextW (), (я использую Unicode-сборку в C ++ с Visual Studio 2010), достаточно ли этой функции вернуть LPCWSTR?Я почти уверен, что есть кое-что, чего я не понимаю, потому что это возвращает странное значение.Я знаю, что LPCWSTR - это строка широких символов с нулевым символом в конце, но я все еще думаю, что что-то упустил!?

const LPCWSTR int2LPCWSTR ( int integer )
{
 wstringstream wss;
 wss << integer;
 const wstring& wstr = wss.str();
 const LPCWSTR p = wstr.c_str();
 return p;
}

Ответы [ 6 ]

9 голосов
/ 07 декабря 2010

Нет ничего плохого в возврате LPCWSTR из функции. Однако возникает общая проблема, связанная с управлением памятью вокруг возвращаемого значения. LPCWSTR обычно хранится в выделенной памяти, поэтому необходимо понимать владение этой памятью между вызывающим и вызываемым абонентом.

Я не хочу выбирать ваш образец, но это хороший пример того, что может пойти не так с возвратом LPCWSTR. Память для строки хранится экземпляром wss, который является локальным для функции. Как только функция возвращает, память освобождается в деструкторе wss и, следовательно, делает недействительным возвращаемое значение.

Если вы уже используете C ++, я рекомендую просто вернуть std::string или wstring напрямую, чтобы избежать путаницы в том, кто владеет выделенной памятью.

wstring int2LPCWSTR ( int integer )
{
 wstringstream wss;
 wss << integer;
 return wss.str();
}

Или, если копирование значения является проблемой, верните его по ссылке.

void int2LPCWSTR ( int integer, wstring& value )
{
 wstringstream wss;
 wss << integer;
 value = wss.str();
}
2 голосов
/ 07 декабря 2010

Вы не можете.
Вернуть wstring, а затем использовать c_str(), чтобы получить LPCWSTR и передать его SetWindowTextW

0 голосов
/ 20 августа 2017
LPWSTR int2LPCWSTR(const int & v)
{
    LPWSTR buffer = new wchar_t[100];
    _itow_s(v, buffer, 100, 10);
    return buffer;
}
0 голосов
/ 07 декабря 2010

Вы должны использовать _itoa, _i64toa, _ui64toa, _itow, _i64tow, _ui64tow функции, предоставляемые во время выполнения (или безопасные, если безопасность касается).

0 голосов
/ 07 декабря 2010

LPCWSTR является указателем на группу wchar_t с.Вы возвращаете указатель, который указывает на локальную переменную (wss) - переменную, которая не существует после возврата вашей функции.Таким образом, ваш указатель ничего не значит и указывает на мусор.

Вместо этого вы должны вернуть std::wstring, потому что он содержит строковые данные, а не просто указатель.

Что-то вроде:

std::wstring int2LPCWSTR ( int integer )
{
 wstringstream wss;
 wss << integer;
 return wss.str();
}

[edit] хотя лично я сделал бы это, используя _itow () по соображениям производительности, как предлагает Саймон Мурье.

0 голосов
/ 07 декабря 2010

Возвращаемое значение .c_str() принадлежит wstr. Когда wstr уничтожается в конце функции, p становится недопустимым указателем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...