Вызывает ли функция GetModuleHandle какие-либо утечки (переполнение стека и утечки памяти) в VC ++ - PullRequest
2 голосов
/ 27 января 2010

Я использую GetModuleHandle в своей функции. Эта функция вызывается каждый раз, когда я делаю операцию. Я хочу знать, будет ли эта функция вызываться снова и снова, будет ли GetModuleHandle вызывать утечку любого дескриптора (переполнение стека или утечка памяти или что-то еще). Я на самом деле знаю, когда его вызывают и когда наступает точка останова. Но я не могу понять, вызывает ли GetModuleHandle какие-либо утечки дескриптора. Может кто-нибудь помочь мне ответить на это. Спасибо, ниже приведена функция, которая неоднократно вызывается в операции.

void Myfunc (int iCtrlID) { HINSTANCE hinst = GetModuleHandle ("r.dll");

s.LoadString (hinst, iCtrlID); // больше кода здесь // }

Ответы [ 2 ]

5 голосов
/ 27 января 2010

Из документации :

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

Чтение: вы зависаете, если пытаетесь освободить ручку Не убирайся и ты в порядке.

3 голосов
/ 27 января 2010

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

Вы можете вызвать FreeLibrary () для дескриптора, чтобы выгрузить dll, если вас беспокоит эта память, но на практике это часто бывает сложно, и большинство процессов просто ждут выхода из процесса, чтобы выгрузить динамически загруженные модули.

Хорошо, я только что проверил это с помощью следующего кода:

  HANDLE h1 = GetModuleHandle(L"user32.dll");
  HANDLE h2 = GetModuleHandle(L"user32.dll");
  HANDLE h3 = GetModuleHandle(L"user32.dll");

Каждый дескриптор один и тот же, и это просто базовый адрес DLL (вы можете проверить это с помощью окна Модули в Visual Studio).

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

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