我正在调试一些遗留代码。它加载用户定义的COM对象,允许用户调用其中的函数,然后释放它。但是,我们发现每次加载和卸载COM对象时,都会泄漏内存。作为测试,我们更改了代码以加载它并挂起它,并继续重复使用它直到程序退出并且泄漏消失。
以下是相关的代码段:
调用此C ++代码来加载COM对象,pszProgId是一个标识目标DLL的字符串。
COleDispatchDriver *pDispatchDriver = NULL;
pDispatchDriver = new COleDispatchDriver();
if (!pDispatchDriver->CreateDispatch(pszProgId, &oleException))
{
throw &oleException;
}
pDispatchDriver->m_bAutoRelease = TRUE;
*ppvObject = (void *) pDispatchDriver;
void ** ppvObject是我们传递的指针,通常用于保存不同的对象。它是一个更大的结构的一部分。 这是我们在发布COM对象时调用的代码。
使用完COM对象后,我们按如下方式释放它:
COleDispatchDriver* pDispatchDriver = (COleDispatchDriver*) (*((LONG_PTR*)(ppvObject)));
pDispatchDriver->ReleaseDispatch();
delete pDispatchDriver;
每次通话泄漏大约1兆。目标COM对象是C#。任何人都知道我们做错了什么或者更好的方式来做我们想要做的事情?
如果相关,我们将在VisualStudio 2015中构建它。
Re xMRi:
如前所述,我们尝试将该标志更改为TRUE,不生效。作为一个完整性检查,我在阅读你的帖子之后再次尝试这样做,并且它再次没有解决内存泄漏问题。所以为了更清晰,我已经更新了我的代码以显示它设置为TRUE,这几乎肯定是正确的值,但仍然表现出上述相同的内存泄漏。
答案 0 :(得分:0)
如果将m_bAutoRelease
设置为FALSE,则ReleaseDispatch不执行任何操作。所以实际上你没有释放这个COM对象的实例。
参见实施:
void COleDispatchDriver::ReleaseDispatch()
{
if (m_lpDispatch != NULL)
{
if (m_bAutoRelease)
m_lpDispatch->Release();
m_lpDispatch = NULL;
}
}
因此创建了将m_bAutoRelease
设置为FALSE
的问题。检查你这样做的原因。
您可以直接获取LPDISPTACH
指针并致电Release()
,但这正是m_bAutoRelease
TRUE
时应该采取的措施。