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

时间:2011-04-20 04:07:33

标签: c++ winapi com

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

(我不能使用引用计数IBlahBlahPtr因为我需要将对象传递给一组不知道COM是什么的API,所以不理解整个“引用计数”指针“东西 - 它们像指针一样传递指针。”

谢谢!

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

根据我们在评论中的对话,我会说你可以做以下事情:

  • 使用智能指针(即IBlahBlahPtr)在您自己的代码中创建和管理COM对象。
  • 维护一组智能指针,表示调用者对您向上传递的指针的引用。每次将新的COM指针移交给调用者时,请将其智能指针放在集合中。
  • 如果您的调用者以某种方式放弃COM指针(例如,在某种“释放”函数中传递COM指针令牌),则在集合中查找其智能指针并将其删除。如果该智能指针(表示调用者对该对象的现在已不存在的引用)是该对象上唯一剩余的引用计数持有者,那么将根据需要进行销毁。
  • 如果您的调用者以非放弃的方式向您传递COM指针,您可以在调用期间将新的智能指针对象包裹在原始指针值周围,这样您就可以在自己的代码中使用智能指针是一致的。多个智能指针可以引用相同的COM对象。

答案 3 :(得分:0)

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