Нужно ли закрывать дескриптор потока после завершения процесса? - PullRequest
0 голосов
/ 10 декабря 2018

После создания процесса и его немедленного прекращения необходимо CloseHandle дескриптор потока, возвращенный в структуре PROCESS_INFORMATION?

  STARTUPINFO si;
  GetStartupInfo(&si);
  PROCESS_INFORMATION pi;
  CreateProcess(0, cmdLine, 0, 0, FALSE, CREATE_SUSPENDED, 0, 0, &si, &pi);

  TerminateProcess(pi.hProcess, 0);

  CloseHandle(pi.hProcess);
  CloseHandle(pi.hThread);  // Is this necessary?

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018
Дескриптор

(индекс в таблице дескрипторов процесса) - это косвенный указатель на объект (в вашем конкретном случае ETHREAD).если не закрыть дескриптор - объект (ETHREAD) не будет свободным (пока ваш процесс не завершится, и все дескрипторы не будут закрыты).запускать процесс, поток или нет - здесь не играют никакой роли.объект не будет уничтожен, пока не будут найдены ссылки на него

0 голосов
/ 10 декабря 2018

Как указано в документах для CreateProcess():

Дескрипторы в PROCESS_INFORMATION должны быть закрыты с помощью CloseHandle, когда они больше не нужны.

А в документах для PROCESS_INFORMATION:

Содержится информация о вновь созданном процессе и его основном потоке.Он используется с функцией CreateProcess, CreateProcessAsUser, CreateProcessWithLogonW или CreateProcessWithTokenW.

[...]

Если функция завершается успешно, обязательно вызовите функцию CloseHandle, чтобы закрыть hProcess и hThreadобрабатывает, когда вы закончите с ними.

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