[唯一]指针的分配器

时间:2011-07-18 01:03:20

标签: memory-management com

由于缺乏关于这个问题的文档,我有些困惑,所以我可能完全偏离这里:

当我分配内存以便通过我已修改其值的唯一指针返回一个对象时,我应该使用什么分配器?

文档说我可以提供MIDL_user_allocate()和MIDL_user_free(),并且存根将使用这些 - 但这在CLSCTX_INPROC_SERVER中没有意义,因为调用对象需要使用(并因此解析)我的分配器。

那么,我应该如何在这里分配内存,以便如果DLL被加载到SVCHOST中,存根代码可以正确地释放列表,并且如果需要,应用程序仍然可以直接使用DLL。

IDL:

HRESULT GetItems([out] DWORD *count, [out, size_is(,count)] ITEM **items);

CPP:

HRESULT STDMETHODCALLTYPE impl::GetBuffer(DWORD *count, ITEM **items)
{
    *count = 0;
    *items = reinterpret_cast<ITEM *>(/* ??? */);
    if(!*items)
        return E_OUTOFMEMORY;
    *count = 5;
    /* fill in items */
    return S_OK;
}

1 个答案:

答案 0 :(得分:0)

来自here

  

out-parameters必须由被调用者分配;它们由调用者使用标准COM任务内存分配器释放。

其中COM task memory allocator是一组IMalloc方法或一组提供相同功能的CoTaskMemAlloc() / CoTaskMemRealloc() / CoTaskMemFree()函数。

您提到的midl_user-*()函数用于RPC内存管理。如果您处理RPC接口而不是COM接口,则需要它们。