COM申请与释放内存分别在server和Client端怎么办?

ahphone 2004-06-14 08:37:06
我看到在客户端一次性释放内存的方法,
现在我需要能在客户端能控制内存释放的范围,而不是都释放掉。

有什么办法吗?
不要说在客户端直接CoTaskMemFree(pMem)就可以了

最好解释一下!
...全文
133 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
天限天空 2004-06-16
  • 打赏
  • 举报
回复
CoTaskMemFree 是 CoGetMalloc 的简化
---------------------------------------------

或则用一个接口专门负责管理内存, 申请的时候想他申请, 释放的时候用个标识释放就行了

快乐鹦鹉 2004-06-15
  • 打赏
  • 举报
回复
不会。Up
wangweixing2000 2004-06-15
  • 打赏
  • 举报
回复
(前提是如果方法掉用中通过任务分配器分配的,但是位于客户地址空间中的),可以用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。
ahphone 2004-06-15
  • 打赏
  • 举报
回复
看过你原来的帖子了,看来你很坚持你原来的观点啊。
我又找了一些书,是很有道理的。
我在潘的COM原理与应用上看到关于
CoGetMalloc的介绍,里面的参数dwMemContext的介绍就和MSDN居然不同~
没有所谓的MEMCTX_SHARED
dhbo 2004-06-15
  • 打赏
  • 举报
回复
来向各位大虾学习,如果是一次分配的内存,能够只释放一部分么?
比如 char * pName = new char[9];
怎么能够删除一部分呢?我觉得好像不现实
xenke 2004-06-15
  • 打赏
  • 举报
回复
服务器和客户端的内存是分开的,但是COM运行库使得它们的内存分配像在同一个空间一样.这是分配函数是上面的而已.你在同一个内存空间中可以这么管理内存,在这里也同样管理,只是替换相应内存管理函数而已.

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧