COM库的内存管理
2022-02-08
51
0
由于COM组件程序和客户程序是通过二进制级标准建立连接的,所以在COM应用程序中凡涉及客户、COM库和组件三者之间内存交互(分配和释放不在同一个模块中)的操作必须使用一致的内存管理器。
COM提供的内存管理标准,实际上是一个IMalloc接口:IID_IMalloc ={00000002-0000-0000-C000-000000000046}
class IMalloc:public IUnknown
{
void * Alloc(ULONG cb)= 0;
void * Realloc(void *pv,ULONG cb)= 0;
void Free(void *pv)= 0;
ULONG GetSize(void *pv)= 0; //返回分配的内存大小
int DidAlloc(void *pv)= 0; //确定内存指针是否由该内存管理器分配
void HeapMinimize()= 0; //使堆内存尽可能减少,把没用到的内存还给操作系统,用于性能优化
}
获得IMalloc接口指针:
HRESULT CoGetMalloc(DWORD dwMemContext,IMalloc **ppMalloc);
CoGetMalloc的第一个参数dwMemContext用于指定内存管理器的类型。
COM库中包含两种内存管理器:
- 一种就是在初始化时指定的内存管理器或其内部缺省的管理器,也称为作业管理器(task allocator),这种管理器在本进程内有效,要获取该管理器,应指定dwMemContext=MEMCTX_TASK;
- 另一种是跨进程的共享分配器,由OLE系统提供,要获取这种管理器,应指定dwMemContext=MEMCTX_SHARED,使用共享管理器的便利是,可在一个进程内分配内存并传给第二个进程,在第二个进程内使用此内存甚至释放掉此内存。
只要返回值为S_OK,则ppMalloc就指向了COM库的内存管理器接口指针,可使用它进行内存操作,使用完毕后,应调用Release成员函数释放控制权。
COM库还封装了三个API函数,可用于内存分配和释放:
void * CoTaskMemAlloc(ULONG cb);
void CoTaskFree(void *pv);
void CoTaskMemRealloc(void *pv,ULONG cb);
这三个函数分配对应于IMalloc的三个成员函数:Alloc、Realloc 和 Free。