描述:
我看到在客户端一次性释放内存的方法,
现在我需要能在客户端能控制内存释放的范围,而不是都释放掉。
有什么办法吗?
不要说在客户端直接CoTaskMemFree(pMem)就可以了
最好解释一下!
解决方案1:
CoTaskMemFree 是 CoGetMalloc 的简化
---------------------------------------------
或则用一个接口专门负责管理内存, 申请的时候想他申请, 释放的时候用个标识释放就行了
(前提是如果方法掉用中通过任务分配器分配的,但是位于客户地址空间中的),可以用CoTaskMemFree()释放全部或者CoTaskMemRealloc(pMem,cb)释放部分,也可以用IMalloc接口的Free()或者Realloc()来释放,最好用后者因为它可以与Windows NT之前的COM版本保持兼容。
原因是:
eg:
typedef struct tagNODE
{
short value;
[unique] struct tagNODE *pNext;
}NODE;
有一个这样的方法:
idl:
HRESULT GetFromNode([out]NODE* pNode);
调用者不可能预见到将有多少个子元素需要分配。然而,因为被调用方(方法)将为每个节点提供数据,所以他可以安全地为每个节点分配内存。方法实现者必须分配一定的内存初始化内嵌指针,问题就在于从哪里申请内存,才能让调用者知道如何释放这些内存?COM就提供了个任务分配器(COM task allocator)。COM的任务分配器是一个以进程为基础的内存分配器,转门用于为[out]和[in,out]内嵌指针分配内存的。有三个api:void *CoTaskMemAlloc(DWORD cb),void CoTaskMemFree(void *pv);void *CoTaskMemRealloc(void *pv,DWORD cb);//增大或者减少*pv;这三个函数对应于c运行库的malloc,free,realloc函数。不同之处在于他们专门供[out]和[in,out]内嵌指针分配内存。另一个重要的区别是,c运行库的函数不能够用于“在一个模块中分配内存,而在另一个模块中释放它”。因为每个c运行库的实现细节都是私有的,不同的编译器之间可以有所不同。在windows NT之前的com版本中,任务分配器的主要操纵方式是通过接口IMalloc。
服务器和客户端的内存是分开的,但是COM运行库使得它们的内存分配像在同一个空间一样.这是分配函数是上面的而已.你在同一个内存空间中可以这么管理内存,在这里也同样管理,只是替换相应内存管理函数而已.