使用CoTaskMemAlloc时,我应该总是调用CoTaskMemFree吗?

bod*_*ydo 3 com memory-management atl

我正在编写一些COM和ATL代码,并且出于某种原因,所有代码都使用CoTaskMemAlloc来分配内存而不是newmalloc.所以我遵循这种编码风格,我也使用CoTaskMemAlloc.

我的老师教我永远deletefree分配记忆.但是,CoTaskMemFree如果我使用的话,我不确定是否应该一直打电话CoTaskMemAlloc

Han*_*ant 9

使用CRT提供的new/malloc和delete/free是COM互操作中的一个问题.为了使它们工作,CRT的同一副本分配和释放内存是非常重要的.在COM互操作方案中执行是不可能的,您的COM服务器和客户端实际上保证使用不同版本的CRT.每个使用自己的堆来分配.这会导致Windows XP上出现无法识别的内存泄漏,这在Vista及其上是一个很难的例外.

这就是COM堆存在的原因,即服务器和客户端同时使用的进程中的单个预定义堆.IMalloc是访问共享堆的通用接口,CoTaskMemAlloc()和CoTaskMemFree()是系统提供的使用该接口的辅助函数.

也就是说,只有在服务器分配内存且客户端必须释放内存的情况下需要这样做.或者相反.在互操作场景中应该总是罕见的,事故的几率太大了.在COM自动化中,只有两种情况,即BSTR和SAFEARRAY,已经包装的类型.在其他情况下,通过让方法调用者提供内存并且被调用者填充它来避免它.这也允许强大的优化,内存可以来自调用者的堆栈.

查看代码并检查谁分配内存以及谁需要释放内存.如果两者都存在于同一个模块中,那么使用new/malloc就可以了,因为现在很难保证同一个CRT实例可以处理它.如果不是这种情况,那么考虑修复它,以便调用者提供内存并释放它.