问个COM内存分配的问题。

贪食蛇男 2011-05-27 09:33:27
有一个COM服务器,EXE的,在一个形如 [out, retval]HRESULT AllocBuffer(BSTR* buffer)的函数里调用
*buffer = (BSTR)CoTaskMemAlloc(1024 * 1024),
在客户程序上多次调用这个函数,但是并不释放内存,然后观察任务管理器,发现服务器和客户程序的内存占用都未增加,
但是提交更改的内存每次都增加1M,然后杀死服务进程时,提交更改的内存一下子下去了,也就是说,这些内存其实在服务器的堆上?
那为何不见服务器进程的内存占用上涨?
...全文
126 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
贪食蛇男 2011-05-27
  • 打赏
  • 举报
回复
哈哈,你误会了我的意思,我其实只是纳闷为何提交更改的和物理内存占用不一致,我表达能力不太给力哈,2,3楼说的对,我不知道任务管理器内存列只显示物理,还有虚拟列,我之前没显示虚拟列,现在是显示后的截图。
看来提交更改是指物理+虚拟的总和。
不过还是谢谢指教哈。

[Quote=引用 8 楼 redui 的回复:]

楼主的手可真快,问题还没搞明白就结了
[/Quote]
redui 2011-05-27
  • 打赏
  • 举报
回复
楼主的手可真快,问题还没搞明白就结了
无言猪 2011-05-27
  • 打赏
  • 举报
回复
CoTaskMemAlloc分配的内存和你正常分配的内存本质上没什么区别,只是有可能他们分配的堆块不一样,也就是heapalloc的时候handle不一样,所以你用CoTaskMemAlloc分配的内存就用CoTaskMemFree来释放,如果自己释放的话,有可能这个handle值就不一样,就会出问题。
redui 2011-05-27
  • 打赏
  • 举报
回复
不是所有COM分配内存都要用 CoTaskMemAlloc,字符串是特殊的,必须用 SysAllocString/SysAllocStringLen 分配内存。

要判断内存是否泄漏,必须了解代理/存根是如何管理内存的,这样就要用到参数属性是 in/out/inout。还有返回值,由服务器分配内存,存根列集传送给客户端的代理,代理散列后,以相同的方式分配内存并返回给客户端,调用过程完成后,存根自动释放内存,所以服务器没有内存泄露,泄露的是客户端。
kyotrue 2011-05-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hiroyukki 的回复:]
引用 1 楼 lostying 的回复:

任务管理器显示的应该是实际占用的内存,你分配的内存页如果没有使用的话可能还是在硬盘上,只是在实际使用的时候交换到内存中,你可以尝试读写一下这些分配的内存,看看有变化没。

我是故意漏的……
我只是想知道服务程序 CoTaskMemAlloc的内存是什么样的一块内存,应该在哪存放,为了让这块内存占用实际的页,我写了这块内存。
[/Quote]
我是说你看内存涨没涨,应该看虚拟内存。。。
贪食蛇男 2011-05-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lostying 的回复:]

任务管理器显示的应该是实际占用的内存,你分配的内存页如果没有使用的话可能还是在硬盘上,只是在实际使用的时候交换到内存中,你可以尝试读写一下这些分配的内存,看看有变化没。
[/Quote]
我是故意漏的……
我只是想知道服务程序 CoTaskMemAlloc的内存是什么样的一块内存,应该在哪存放,为了让这块内存占用实际的页,我写了这块内存。
oyljerry 2011-05-27
  • 打赏
  • 举报
回复
可以查看进程的虚拟内存等,然后看是否递增增长。那么就有可能泄漏。
kyotrue 2011-05-27
  • 打赏
  • 举报
回复
任务管理器的内存使用仅仅是目前驻留在物理内存中的量,虚拟内存大小,才是你实际申请的内存地址空间大小,这个一直涨的话,就肯定有泄露。
无言猪 2011-05-27
  • 打赏
  • 举报
回复
任务管理器显示的应该是实际占用的内存,你分配的内存页如果没有使用的话可能还是在硬盘上,只是在实际使用的时候交换到内存中,你可以尝试读写一下这些分配的内存,看看有变化没。

3,245

社区成员

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

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