gpt4 book ai didi

windows - 为什么我的 COM 工厂在程序生命周期内从未被释放?

转载 作者:可可西里 更新时间:2023-11-01 09:31:37 27 4
gpt4 key购买 nike

我有一个 native C++ ATL 进程内 COM 服务器。单独的测试程序

  • 调用CoInitialize()
  • 调用 CoCreateInstance(),然后
  • 在指针上调用 Release()
  • 然后调用 CoUnitialize() 并退出。

如果我在 Visual C++ 调试器下运行测试程序,调试 CRT 会报告一次内存泄漏,并且每次分配的编号都是相同的。

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

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

  • 程序调用 CoCreateInstance()
  • COM 内部调用 DllGetClassObject()
  • ATL 实例化工厂并将所有权传递给调用者(COM 内部)

然后工厂永远不会被释放 - 我没有看到对类工厂的 Release() 的足够调用。

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

最佳答案

原来是ATL实现的问题。

服务器使用全局 CComModule 类实例。当调用 CComModule::DllClassObject() 时,它会创建一个类工厂实例并将其缓存在 CComModule 对象引用的映射中。所以实际上 CComModule 对象拥有类工厂。当 CComModule 析构函数运行时,它不会释放缓存的类工厂。

为了释放所有缓存的类工厂,CComModule::Term() 方法应该在服务器卸载之前被调用。 IMO 实现此目的的最简洁方法是派生自 CComModule 并在派生类析构函数中调用 CComModule::Term()

关于windows - 为什么我的 COM 工厂在程序生命周期内从未被释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4033737/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com