有一个COM服务器,EXE的,在一个形如 [out, retval]HRESULT AllocBuffer(BSTR* buffer)的函数里调用
*buffer = (BSTR)CoTaskMemAlloc(1024 * 1024),
在客户程序上多次调用这个函数,但是并不释放内存,然后观察任务管理器,发现服务器和客户程序的内存占用都未增加,
但是提交更改的内存每次都增加1M,然后杀死服务进程时,提交更改的内存一下子下去了,也就是说,这些内存其实在服务器的堆上?
那为何不见服务器进程的内存占用上涨?

解决方案 »

  1.   

    我是故意漏的……
    我只是想知道服务程序 CoTaskMemAlloc的内存是什么样的一块内存,应该在哪存放,为了让这块内存占用实际的页,我写了这块内存。
      

  2.   

    不是所有COM分配内存都要用 CoTaskMemAlloc,字符串是特殊的,必须用 SysAllocString/SysAllocStringLen 分配内存。要判断内存是否泄漏,必须了解代理/存根是如何管理内存的,这样就要用到参数属性是 in/out/inout。还有返回值,由服务器分配内存,存根列集传送给客户端的代理,代理散列后,以相同的方式分配内存并返回给客户端,调用过程完成后,存根自动释放内存,所以服务器没有内存泄露,泄露的是客户端。
      

  3.   

    CoTaskMemAlloc分配的内存和你正常分配的内存本质上没什么区别,只是有可能他们分配的堆块不一样,也就是heapalloc的时候handle不一样,所以你用CoTaskMemAlloc分配的内存就用CoTaskMemFree来释放,如果自己释放的话,有可能这个handle值就不一样,就会出问题。