ACE 内存管理

来源:互联网 发布:php ip白名单 编辑:程序博客网 时间:2024/06/17 07:10
ACE的内存管理类常用的就是两个,一个是ACE_Cached_Allocator,一个是ACE_Malloc,这两个类都可以和锁相结合完成多线程中内存申请同步问题,下面介绍这两个类。2.1缓存内存分配类ACE_Cached_Allocator这个类在构造函数中通过new操作预先分配一定的内存,并按照第一个模板参数的大小对内存进行分块把每一块的内存偏移指针作为链表的节点存放在成员变量ACE_Locked_Free_List中,在析构时释放已申请的内存。类的定义:ACE_Cached_Allocator<class T, class ACE_LOCK> ,第一个模板参数为链表节点内存块的大小,第二个模板参数为锁策略。用户常使用方法有malloc()、calloc()、free(),用户在调用这几个函数申请内存时,ACE_Cached_Allocator只是每次从链表中返回一个节点,用户每次申请内存的大小不能超过sizeof(T),malloc和calloc不同之处是calloc根据第二个参数对内存初始化。下面为使用例子程序:#include "ace/malloc.h" struct SNode{int n;};int main (int argc, ACE_TCHAR * argv[]){ACE_Cached_Allocator<char[32], ACE_Thread_Mutex> allocator(64);ACE_Cached_Allocator<SNode, ACE_Null_Mutex> stu_allocator(8);char * p = (char*)allocator.malloc(32);if (!p) {ACE_DEBUG((LM_DEBUG, "申请内存为空\n"));}SNode * node = (SNode*)stu_allocator.malloc(sizeof(SNode));if (!node) {ACE_DEBUG((LM_DEBUG, "申请内存为空\n"));} else {ACE_DEBUG((LM_DEBUG, "val:%d\n", node->n));stu_allocator.free(node);}if ( node = (SNode*)stu_allocator.calloc(sizeof(SNode)) ) {ACE_DEBUG((LM_DEBUG, "val:%d\n", node->n));}allocator.free(p);stu_allocator.free(node);return 0;}2.2内存分配器ACE_Malloc和ACE_Cached_Allocator不同的是,ACE_Malloc提供几个内存池类型,通过指定不同的内存池类型可以实现进程间内存共享,满足进程间内存共享的类型包括:ACE_MMAP_Memory_Pool、ACE_Shared_Memory_Pool、ACE_Local_Memory_Pool。ACE_Malloc只是根据第一个模板参数调用不同的内存池实现内存分配,在实现跨进程内存上ACE_Malloc通过一个名称与每次申请的内存块进行绑定,在进程内的使用函数有malloc、free,进程间多了bind、find函数,下面先演示进程内使用:#include "ace/os.h"#include "ace/local_memory_pool.h"#include "ace/Synch.h"#include "ace/malloc.h"#include "ace/malloc_t.h"typedef ACE_Malloc<ACE_LOCAL_MEMORY_POOL, ACE_Null_Mutex> CMemMalloc;struct SNode{int n;};int main(int argc, char * argv[]){CMemMalloc memMalloc;SNode * ptrNode = (SNode*)memMalloc.malloc ( sizeof(SNode) );if ( NULL == ptrNode ) {ACE_DEBUG ((LM_DEBUG, "申请内存失败\n"));} else {memMalloc.free (ptrNode);}return 0;}

0 0
原创粉丝点击