我们的某个应用程序有一个很长的循环,当我们的应用程序访问另一个提供COM访问作为“本地服务器”的共享应用程序/服务时,偶尔会导致Windows XP(SP3)RPCSS服务泄漏内存。
我现在已经回到了原始问题(我认为),并且如果应用程序正在快速访问其他本地服务器(如IExplore.exe),则会显示相同的泄漏
使用Process Explorer监视RPCSS服务,启动IE然后运行以下命令后,RPCSS服务将在几秒钟后开始显示一些稳定的IO使用情况,然后私有字节将开始稳步增加。停止应用程序会释放大部分内存,但并不总是释放所有内存。
#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和调用本地服务有一些限制吗?