new与delete的运算符重载函数,实现了内存池,节点的申请与开辟
2017-07-15 16:11
204 查看
new与delete的运算符重载函数
//new与delete的运算符重载函数,实现了内存池,节点的申请与开辟 //该内存池的实现智能在单线程中使用,因为该方法在多线程环境中存在竟态条件,并不满足线程安全。 //其中定义一个Queue类,以及嵌套类QueueItem //嵌套类的静态成员变量需在类体外进行初始化 //静态成员变量:static QueueItem *_pfreelist; template<T> typename Queue<T> :: QueueItem *Queue<T>::QueueItem::_pfreelist = NULL; const int MEM_POOL_SIZE = 1000; //new运算符重载函数 void *operator new(size_t size) //size_t ==》QueueItem node;(大小) { QueueItem *pcur = NULL; //判断内存池是否存在 if(_pfreelist == NULL) //内存池不存在 { int allocsize = MEM_POOL_SIZE * size; _pfreelist = (QueueItem *)new char[allocsize]; //此处也是将申请的节点链起来,类似于链表,但与链表的不同之处在于此处的内存都是连续的,而正式的链表中内存是不连续的。 for(pcur = _pfreelist;pcur < _pfreelist+MEM_POOL_SIZE-1;++pcur) { pcur->_pnext = pcur + 1; } pcur->_pnext = NULL; } //内存池存在 pcur = _pfreelist; _pfreelist = _pfreelist->_pnext; return pcur; } //delete的运算符重载函数 void operator delete(void * ptr) { if(ptr == NULL) return; QueueItem *pcur = (QueueItem *)ptr; //进行类型的强制转换 pcur -> _pnext = _pfreelist; _pfreelist = pcur; } //每个进程中有多个线程,每个线程不同的就是线程栈和寄存器值 //线程栈:为线程开辟一个内存栈 //寄存器值:存放cpu中间值
相关文章推荐
- new delete 运算符重载之 内存池申请
- 运算符重载 编程题#3(重载:* operator, & operator=, & operator(); 函数 memcpy 的使用;动态分配内存空间 new, delete;二级指针**pArr)
- 面试题7:用两个栈实现队列,队列的声明如下,请实现它的两个函数appendTail和deleteHead, 分别完成在队列尾部插入结点和在队列头部删除节点的功能。
- C++实现输入输出运算符重载、友元函数和成员函数实现复数类Complex
- c++内存分配优先使用内存池,而不是new,delete
- 第12周项目1-实现复数类中的运算符重载(2)使用友缘函数
- c++中优化内存分配:new/delete操作符;allocator类对象的使用;operator new/operator delete函数及定位new表达式
- c++ 重载new和delete实现内存管理
- 要求:不申请变量和空间反转字符串,用一个函数实现。VIA笔试题
- day02逆置/反转单链表+查找单链表的倒数第k个节点+实现一个Add函数不用四则运算
- 由反序列化二叉树实现函数引起的二叉树节点递归调用问题
- 第8周项目1(1)-用成员函数实现复数类中的运算符重载
- proxy 利用get拦截,实现一个生成各种DOM节点的通用函数dom。
- new delete 是运算符,malloc,free是函数(区别)
- 学习之第一周小结 malloc、calloc、realloc、free、new、delete函数应用
- c++基础之用new和delete申请内存与创建对象
- 开辟一个二维数组,有10*8个元素,用随机数填充,按照下面的方法用函数实现查找一个数是否存在
- 【C++】模拟实现new[]和delete[]
- VC 运行时库中的 new/delete 函数
- C++中,申请字符串数组可用new实现