如何判断我是否泄漏了 COM 对象?



我正在编写一些代码(相对简单)使用COM,在一些对象上调用AddRef()并稍后释放它们。除了彻底检查代码之外,是否有一种方法可以检查是否到处都在泄漏COM对象?

(我不能使用引用计数的IBlahBlahPtr,因为我需要将对象传递给一组不知道COM是什么的api,因此不理解整个"引用计数指针"的事情-他们像令牌一样传递指针。)

谢谢!

这与检查任何C或c++代码中的泄漏没有什么不同。使用<crtdbg.h>检测泄漏,MSDN库文章在这里。如果没有足够的IUnknown::Release()调用,您将获得类工厂的泄漏报告。

引用计数接口指针是一个硬性的COM要求,你不能只是耸耸肩。如果客户端代码不这样做,那么你必须在向该代码传递指针之前自己处理它。知道指针何时不再使用当然是更棘手的问题。

如果您使用CrtDebug DEBUG_NEW来分配您的对象,您将在退出时获得所有泄漏对象的自动转储(基本上,所有未释放的内存),以及文件名和分配内存的行。

根据我们在评论中的对话,我认为你可以这样做:

  • 使用智能指针(即IBlahBlahPtr)在您自己的代码中创建和管理COM对象。维护一个智能指针的集合,表示调用者对你向上传递的指针的引用。每次你把一个新的COM指针交给调用者时,把它的智能指针放到集合中。
  • 如果你的调用者以某种方式放弃了一个COM指针(比如,在某种"释放"函数中传递给你COM指针令牌),那么在集合中查找它的智能指针并删除它。如果该智能指针(表示调用者对对象的现已失效的引用)是对象上引用计数的唯一剩余持有者,则将按照期望发生销毁。
  • 如果你的调用者以一种不放弃的方式传递给你一个COM指针,你可以在调用期间在原始指针值周围包装一个新的智能指针对象,这样你在自己的代码中使用智能指针是一致的。多个智能指针可以指向同一个COM对象。

各种工具将为您检查。BoundsChecker。我认为,但不是100%确定,AppVerifier(它有额外的好处是免费的)。

最新更新