C++实现简单的内存池
来源:互联网 发布:知乎中央民族大学舞蹈 编辑:程序博客网 时间:2024/06/05 11:19
没有考虑线程安全,只是简单的实现了内存池
功能:第一次先申请一大片内存,然后分成小块,每次分配给应用程序这小块内存,当内存不够了又继续向系统申请一大片内存
直接晒代码
MemPool.h
#include <iostream>template<typename T>class MemPool{public: MemPool(){} MemPool(T data) :data(data){} //这两个函数编译器就默认处理成static函数 void *operator new(size_t size) { MemPool *pCur; if (!pHead)//如果内存不够了,向系统申请内存 { int allocsize = size * MEM_POOL_SIZE; cout << "第" << ++count << "向系统申请了" << allocsize << "字节内存" << endl; pHead = (MemPool*)new char[allocsize]; for (pCur = pHead; pCur < pHead + MEM_POOL_SIZE - 1;++pCur) pCur->pNext = pCur + 1; pCur->pNext = NULL; } pCur = pHead; pHead = pHead->pNext; return pCur;//这里只是把其中一片内存给用户了,用户并不能通过 ->pNext 得到下一片内存★★★★★ } void operator delete(void *ptr) { cout << "MemPool delete" << endl; if (!ptr) return; MemPool *cur = (MemPool*)ptr; cur->pNext = pHead; pHead = cur; }public: MemPool *pNext; static const unsigned int MEM_POOL_SIZE = 10; static MemPool *pHead; static int count; T data;};template<typename T>static MemPool<T> *initNull(){ cout << "initNull" << endl; return NULL;}template<typename T>MemPool<T> *MemPool<T>::pHead = initNull<T>();template<typename T>int MemPool<T>::count = 0;
Queue.h
#include "Mempool.h"template<typename T>class Queue{public: Queue() { prear = pfirst = NULL; } ~Queue() { MemPool<T> *pcur = pfirst; while (pcur != prear) { pfirst = pfirst->pNext; delete pcur; pcur = pfirst; } } T front() { if (!pfirst) return NULL; return pfirst->data; } T back() { if (!prear) return NULL; return prear->data; } void push(const T &d) { /*prear = new MemPool<T>(d); if (!pfirst) pfirst = prear;*/ MemPool<T> *p = new MemPool<T>(d); if (!prear) prear = pfirst = p; else { prear->pNext = p; prear = p; } } void pop() { if (pfirst == prear) { delete pfirst; pfirst = prear = NULL; } else { MemPool<T> *pFree = pfirst; pfirst = pfirst->pNext; delete pFree; } } bool empty() { if (prear == NULL && pfirst == NULL) return true; return false; }private: MemPool<T> *prear; MemPool<T> *pfirst;};
main
#include "Queue.h"#include <queue>using namespace std;int main(){ Queue<int> q1; queue<int> q2; for (int i = 0; i < 22; i++) { q1.push(i); q2.push(i); } while (!q1.empty()) { cout << q1.front() << " "; q1.pop(); } while (!q2.empty()) { cout << q2.front() << " "; q2.pop(); } cout << endl; system("pause"); return 0;}
0 0
- 一个简单实用的内存池之一(c实现)
- 一个简单的内存池(c实现)之一
- 一个简单实用的内存池之一(c实现)
- 一个简单实用的内存池之一(c实现)
- C语言实现简单内存池
- C语言实现简单内存池
- 内存池的简单实现
- 简单内存池的实现
- 简单的内存池实现
- 简单的内存池实现
- c实现的内存池
- C 内存池的实现
- 简单变长内存池实现的实现
- 简单变长内存池实现的实现
- 一个简单实用的内存池实现之二 (C实现)
- 一个简单实用的内存池实现之二 (C实现)
- 一个简单实用的内存池实现之二 (C实现)
- C语言枚举进程,实现一个简单的内存补丁
- 在微信里点击拉起APP到特定页面---Apple Universal Link的摸索
- 【面试】实现页面跳转的两种方法
- UIView的layoutSubviews和drawRect方法何时调用
- 浏览器关闭后,Session会话结束了么?
- synchronized二三事4
- C++实现简单的内存池
- 继承 接口实现练习(运动员教练类)
- java使用反射生成JDK动态代理
- Web Service基本概念
- JSS 第 4 篇
- HTTP协议—— 简单认识TCP/IP协议
- 用于替换的正则表达式(多个空格或换行各变为一个空格或换行)
- 【面试】页面之间的值传递
- 康托展开及其逆运算