Каково ограничение при вызове CoInitializeEx / CoUninitialize несколько раз - утечка памяти в службе RPCSS - PullRequest
0 голосов
/ 30 ноября 2011

У одного из наших приложений есть длинный цикл, который иногда вызывает утечку памяти службы RPCSS в Windows XP (SP3), когда наше приложение обращается к другому общему приложению / службе, предоставляющему доступ к COM в качестве «локального сервера».

Я вернул ее к исходной проблеме (думаю) и могу показать ту же утечку, если приложение довольно быстро обращается к другим локальным серверам, таким как IExplore.exe

Используя Process Explorer для мониторинга службы RPCSS, запустив IE и затем выполнив следующее, служба RPCSS начнет показывать некоторое устойчивое использование ввода-вывода через несколько секунд, а затем частные байты начнут неуклонно увеличиваться. Остановка приложения освобождает большую часть этой памяти, но не всегда всю.

#include <exdisp.h>
while(true){
  HRESULT hrIni = CoInitializeEx(NULL, COINIT_MULTITHREADED);
  {
    HRESULT hr;

    CComPtr<IWebBrowser2> pBrowser2;
    hr = CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_LOCAL_SERVER, IID_IWebBrowser2, (void**)&pBrowser2);
  }
  if( hrIni == S_OK || hrIni == S_FALSE ) CoUninitialize();
}

Это не приводит к утечке службы RPCSS - сервер процесса

#include <activeds.h>
while(true){
  HRESULT hrIni = CoInitializeEx(NULL, COINIT_MULTITHREADED);
  {
    HRESULT hr;

    CComPtr<IADsADSystemInfo> pSys;
    hr = CoCreateInstance(CLSID_ADSystemInfo, NULL, CLSCTX_INPROC_SERVER, IID_IADsADSystemInfo, (void**)&pSys);        
  }
  if( hrIni == S_OK || hrIni == S_FALSE ) CoUninitialize();
}

Эта корректировка для обеспечения CoInit и удаления в более широком контексте, по-видимому, предотвращает утечку или, возможно, просто делает ее очень медленной

HRESULT hrIni = CoInitializeEx(NULL, COINIT_MULTITHREADED);
while(true){
  {
    HRESULT hr;

    CComPtr<IWebBrowser2> pBrowser2;
    hr = CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_LOCAL_SERVER, IID_IWebBrowser2, (void**)&pBrowser2);
  }
}
if( hrIni == S_OK || hrIni == S_FALSE ) CoUninitialize();

Я совершил какую-то глупую ошибку, я просто не понимаю, почему это не будет чистым? или есть какие-то ограничения на init / uninit и вызов локальной службы?

...