Насколько правильна эта функция?

282
14 июля 2017, 05:13

Здравствуйте! Насколько правильна данная функция по получению имени пользователя с точки зрения выделения и чистки памяти? Нужно ли чистить память и могут ли быть какие то проблемы с данным кодом? Необходимо использовать чистый winapi, так что, std::string не вариант.

bool getCU(LPTSTR* usrBuf) {
    DWORD usrLen =  (sizeof(usrBuf)/sizeof(*usrBuf))+1;
    if (GetUserName((LPTSTR)usrBuf, &usrLen)) return true; else return false;
}
LPTSTR User[UNLEN+1]; 
    if (getCU(User)) MessageBox(0, (LPCTSTR)User, L"", 0);

Я правильно понимаю, что я передаю функции getCU указатель на LPTSTR массив который хранится в не самой функции? Это правильный подход?

Answer 1

Функция совершенно бессмысленная.

  1. Применять прием sizeof(usrBuf)/sizeof(*usrBuf) к указателю никакого смысла нет. Этот прием работает только с массивами, а не с указателями.

  2. Почему передается LPTSTR* usrBuf? Указатель на указатель? При чем здесь указатель на указатель?

  3. Переданный указатель на указатель LPTSTR* usrBuf силой приводится к типу LPTSTR? Это бессмысленно.

  4. LPTSTR User[UNLEN+1] - это массив указателей. Что вы хотели этим сказать? Зачем вам понадобился массив указателей? И какой смысл передавать этот массив указателей в MessageBox, силой приведя его к LPTSTR?

  5. Если вы пишете ваш код в терминах T-типов-"первертышей" (LPTSTR), то тогда уж придерживайтесь этого правила везде. Т.е. не L"", а _T("").

В общем код бессмыслен. В некоей изначальной форме он, очевидно, порождал простыню сообщений об ошибках от компилятора. Эти сообщения были "задушены" расстановкой явных приведений типа. Код от этого стал еще более бессмысленным.

bool getCU(LPTSTR usrBuf, DWORD usrLen) 
{
  return GetUserName(usrBuf, &usrLen);
}
...
TCHAR User[UNLEN+1]; 
if (getCU(User, sizeof User / sizeof *User))
  MessageBox(0, User, _T(""), 0); 

Но в чем вообще заключается идея? Зачем писать некую функцию-оболочку getCU, которая фактически ничего не делает, кроме вызова GetUserName?

typedef std::basic_string<TCHAR> tstring;
tstring getCU()
{
  TCHAR usrBuf[UNLEN+1]; 
  DWORD usrLen = sizeof usrBuf / sizeof *usrBuf;
  if (!GetUserName(usrBuf, &usrLen))
    usrBuf[0] = 0;
  return tstring(usrBuf);
}
...
tstring User = getCU();
if (!User.empty())
  MessageBox(0, User.c_str(), _T(""), 0);
READ ALSO
Как сделать программу-фильтр для потока видео?

Как сделать программу-фильтр для потока видео?

Есть поток видеоТо есть, бесконечный

252
Переделать char функцию под int

Переделать char функцию под int

Здравствуйте, нужно переделать данную функцию, так, что б вместо подпоследовательности char, она проверяла подпоследовательность int:

324
Создать 2D анимацию для приложения UWP с привязкой DirectX

Создать 2D анимацию для приложения UWP с привязкой DirectX

Есть приложение UWP (C#),которое отображает текущую погоду и ее прогноз, с самым простым функционалом

246