new与delete的运算符重载函数,实现了内存池,节点的申请与开辟
来源:互联网 发布:淘宝母婴用品批发 编辑:程序博客网 时间:2024/06/08 14:29
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中间值
阅读全文
1 0
- new与delete的运算符重载函数,实现了内存池,节点的申请与开辟
- 通过重载new与delete运算符避免向系统重复申请内存从而提高程序运行效率的办法
- new delete 运算符重载之 内存池申请
- new与delete申请内存
- new与delete的重载
- C++学习:动态内存分配对象的new/delete运算符与函数malloc/free
- delete释放new[ ]开辟的内存
- malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存
- 运算符new和delete的重载
- 动态内存开辟:new/delete,malloc/free区别与联系
- 重载operator new与operator delete构建内存池
- 重载operator new与operator delete构建内存池
- 类的operator new与operator delete的重载
- 类的operator new与operator delete的重载
- 类的operator new与operator delete的重载
- 类的operator new与operator delete的重载
- 重载运算符的实现与应用
- [ZZ]重载new/delete 运算符与 重载全局异常处理
- “玲珑杯”ACM比赛 Round #18 B -- 数论你还会快速幂【规律】
- sqlcmd用法
- HDU3183 A Magic Lamp
- Qt 执行CMD命令
- 算法题:二叉搜索树与双向链表
- new与delete的运算符重载函数,实现了内存池,节点的申请与开辟
- onsubmit校验表单时利用ajax的return false无效解决方法
- Foreign Exchange UVA
- Ubuntu16.04安装ptotobuf&Java Demo
- 机器学习中理解算法的归纳偏置(偏好)
- JavaScript中逻辑运算符、位运算符以及简单数据类型转换的问题
- 带花树算法--一般图最大匹配
- web前端工程师----网页布局
- 数据集无损处理