代码之家  ›  专栏  ›  技术社区  ›  sharptooth

为什么我的COM工厂在程序生命周期内从未发布?

  •  3
  • sharptooth  · 技术社区  · 14 年前

    在PROC COM服务器中有一个本地C++ ATL。单独的测试程序

    • 电话 CoInitialize() ,
    • 电话 CoCreateInstance() 然后
    • 电话 Release() 在指针上,
    • 然后打电话 CoUnitialize() 然后退出。

    如果在Visual C++调试器下运行测试程序,调试CRT报告单个内存泄漏,并且每次分配号相同。

    我用过 an allocation hook 发现没有返回到堆的对象是类工厂对象。

    所以基本上会发生以下情况:

    • 程序调用 共同创建状态()
    • COM内部调用 DllGetClassObject()
    • ATL实例化工厂并将所有权传递给调用方(COM内部)

    然后工厂就再也没有被释放-我看不到足够的电话 释放() 类工厂的。

    发生什么事了?这是COM运行时的缺陷吗?

    1 回复  |  直到 14 年前
        1
  •  2
  •   sharptooth    14 年前

    结果发现这是一个ATL实现的问题。

    服务器使用全局 CComModule 类实例。什么时候? CComModule::DllClassObject() 它创建一个类工厂实例并将其缓存在 C模块 对象。所以事实上 C模块 对象拥有类工厂。什么时候? C模块 析构函数运行它不会释放缓存类工厂。

    为了释放所有缓存类工厂 CComModule::Term() 应在卸载服务器之前调用方法。在我看来,实现这一目标最干净的方法是 C模块 然后打电话 cCommodule::Term()。 在派生类析构函数中。