|
|
内存所有权 |
|
|
早就想开始写了,但是最近总是网页打不开,这让我十分的郁闷。今天在等待很久之后终于打开了。等的我写作的欲望全无,但也不能白打开一次。贴点对内存操作的东东吧。
在一个分布式环境中(客户端和服务器在不同的进程或计算机上运行),内存管理是一个非常重要的事情。在许多情况下,服务器必须分配系统内存,并把它返回给客户端程序,但是有时候服务器并不知道客户端是什么时候不再需要服务器所分配的内存。自己编写OPC服务器就必须面对这一问题。OPC是基于COM的,COM提供了专门的API并按照一定的规则来处理上述的内存管理问题。
在编写OPC服务器时就应该利用COM提供的内存操作函数,COM中的IMalloc提供了我们熟悉的C运行时内存函数(malloc和free)的封装。但接口使用起来总不是那么方便,幸运的是COM为我们提供了这个接口的两个辅助函数,使我们可以像使用malloc和free这两个C函数一样。
下面是一个很简单的辅助内存操作函数
// OpcAlloc
void* OpcAlloc(size_t tSize)
{
return CoTaskMemAlloc(tSize);
}
//===========================================
// OpcFree
void OpcFree(void* pBlock)
{
if (pBlock != NULL)
{
CoTaskMemFree(pBlock);
}
}
也可以使用模板实现
template <typename T>
T* allocate_buffer( size_t count )
{
T* p = (T*)CoTaskMemAlloc( sizeof(T) * count );
ZeroMemory( p, sizeof(T) * count );
return p;
}
以上两个十分简单的例子已经可以说明CoTaskMemAlloc和CoTaskMemFree的使用。你完全可以当malloc和free一样的使用。
COM通过IDL描述语言对其跨进程的内存分配和释放问题提供了严格的规则。
IDL对其描述的方法的参数指定了in和out属性,通过这两个属性或其组合来规范内存的申请和释放的原则。
1只带in属性的参数,客户端负责分配和释放这些参数的内存。
2只带out属性的参数,服务器负责分配这些参数的内存而客户端负责释放参数所占用的内存。
3对于带in/out属性的参数,客户端分配内存并负责释放参数所占用的内存,但是如果需要的话,服务器可以选择重新分配内存。
HRESULT STDMETHODCALLTYPE GetStatus(
/* [out] */ OPCSERVERSTATUS **ppServerStatus)
这种参数为指向指针的指针的out参数在调用时,客户端应负责释放参数所占用的空间。
以后向大家介绍代码时可能大家能更清楚地体会到这2个函数的用法,个人觉得还比较好用,当然你完全可以使用IMalloc(都看个人习惯了),甚至用malloc和free(但是不推荐)。这里只是告诉你我的习惯用法。你要发现有误导大家的东西,请指正,因为我不是神,也没有把所有的东西都精通,只是接触早了一点熟练一点而已。赫赫。 |
|
|
|
相关博客新闻: |
|
|