У одного из наших приложений есть длинный цикл, который иногда вызывает утечку памяти службы 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 и вызов локальной службы?