我正在编写一些代码(相对简单)使用COM,在一些对象上调用AddRef()并稍后释放它们。除了彻底检查代码之外,是否有一种方法可以检查是否到处都在泄漏COM对象?
(我不能使用引用计数的IBlahBlahPtr
,因为我需要将对象传递给一组不知道COM是什么的api,因此不理解整个"引用计数指针"的事情-他们像令牌一样传递指针。)
谢谢!
这与检查任何C或c++代码中的泄漏没有什么不同。使用<crtdbg.h>
检测泄漏,MSDN库文章在这里。如果没有足够的IUnknown::Release()调用,您将获得类工厂的泄漏报告。
如果您使用CrtDebug DEBUG_NEW来分配您的对象,您将在退出时获得所有泄漏对象的自动转储(基本上,所有未释放的内存),以及文件名和分配内存的行。
根据我们在评论中的对话,我认为你可以这样做:
- 使用智能指针(即
IBlahBlahPtr
)在您自己的代码中创建和管理COM对象。维护一个智能指针的集合,表示调用者对你向上传递的指针的引用。每次你把一个新的COM指针交给调用者时,把它的智能指针放到集合中。 - 如果你的调用者以某种方式放弃了一个COM指针(比如,在某种"释放"函数中传递给你COM指针令牌),那么在集合中查找它的智能指针并删除它。如果该智能指针(表示调用者对对象的现已失效的引用)是对象上引用计数的唯一剩余持有者,则将按照期望发生销毁。
- 如果你的调用者以一种不放弃的方式传递给你一个COM指针,你可以在调用期间在原始指针值周围包装一个新的智能指针对象,这样你在自己的代码中使用智能指针是一致的。多个智能指针可以指向同一个COM对象。
各种工具将为您检查。BoundsChecker。我认为,但不是100%确定,AppVerifier(它有额外的好处是免费的)。