在PROC COM服务器中有一个本地C++ ATL。单独的测试程序
CoInitialize()
CoCreateInstance()
Release()
CoUnitialize()
如果在Visual C++调试器下运行测试程序,调试CRT报告单个内存泄漏,并且每次分配号相同。
我用过 an allocation hook 发现没有返回到堆的对象是类工厂对象。
所以基本上会发生以下情况:
共同创建状态()
DllGetClassObject()
然后工厂就再也没有被释放-我看不到足够的电话 释放() 类工厂的。
释放()
发生什么事了?这是COM运行时的缺陷吗?
结果发现这是一个ATL实现的问题。
服务器使用全局 CComModule 类实例。什么时候? CComModule::DllClassObject() 它创建一个类工厂实例并将其缓存在 C模块 对象。所以事实上 C模块 对象拥有类工厂。什么时候? C模块 析构函数运行它不会释放缓存类工厂。
CComModule
CComModule::DllClassObject()
C模块
为了释放所有缓存类工厂 CComModule::Term() 应在卸载服务器之前调用方法。在我看来,实现这一目标最干净的方法是 C模块 然后打电话 cCommodule::Term()。 在派生类析构函数中。
CComModule::Term()
cCommodule::Term()。