наш проект (С++, Visual Studio 7.0, unmanaged код,
.NET не используется) использует компоненту
IHTMLDocument2 (MSHTML парсер) для многопотоковой
откачки документов из Inet.
Ее использование ведется в духе примера WalkAll,
входящего в Internet Programming SDK.
Каждый поток инициализирует библитеку COM, входит в STA,
создет экземпляр MSHTML парсера, загружает 1 документ,
вызывает Release всего что надо (тут тщательно все перепроверялось),
вызывает CoUninitialize и завершает работу.
ПРОБЛЕМА:
Имеем при работе постоянно возрастающий расход виртуальной
и физической памяти, что приводит к печальным последствиям.
Для теста следующий фрагмент кода был помещен в простейшее
консольное приложение.
pMSHTML->Release();
// Здесь ушло около 40 КВ
Error:
CoUninitialize();
// Здесь вернулось около 400 КВ. Итого минус 1 МВ.
// Причем MSHTML.dll в данный момент уже выгружена из процесса
Если зациклить код между CoInitialize и
CoUninitialize, то утечка памяти не прогрессирует.
После изучения MSDN и Google-groups мы пришли к выводу,
что MSHTML парсер использует smart allocation policy,
т.е. ведет свой кэш-памяти, который освобождается по
механизму "сборщика мусора" Однако прямого подтверждения
этого факта мы не нашли (есть только его подтверждение
для MSXML парсера).
COM библиотека не позволяет зарегистрировать свой allocator
памяти.
Может кто-нибудь подскажет как недопускать утечки памяти
при работе с MSHTML парсером. Любая информация по
данной проблеме будет с благодарностью принята.