生活随笔
收集整理的這篇文章主要介紹了
简易的实现对象内存池
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
簡易的實現對象內存池
MemoryNode結構體是保存每一個申請的內存節點,然后構成一個單鏈表。
MemoryNodeList 結構體是保存的是每一塊內存,當上一個內存塊用完時,再次創建一個內存塊。
numofMemoryNode:一個內存塊的內存節點數量
numofmemoryList:內存塊數量
numofAlloc:已經分配出去的內存數量
刪除2 改為回收值為2的節點內存
#pragma once
template<class T>
class MemoryPool
{
public:struct MemoryNode {T element
;MemoryNode
* next
;};struct MemoryNodeList {MemoryNode
* memoryNode
;MemoryNodeList
* next
;};MemoryPool() {currenetNode
= nullptr; memoryList
= nullptr;}~MemoryPool();bool create(const int num
);void destroy();T
* Alloc();void Free(const T
* obj
);int getPoolSize()const { return numofmemoryList
* numofMemoryNode
; }bool IsCreate()const { return memoryList
!= nullptr; }int getAlloc()const { return numofAlloc
; }
private:MemoryNodeList
* memoryList
;MemoryNode
* currenetNode
;int numofMemoryNode
;int numofAlloc
;int numofmemoryList
;
};
#include "MemoryPool.h"
template<class T>
MemoryPool
<T
>::~MemoryPool() {
if (getPoolSize()>0||IsCreate()) {destroy();}
}template<class T>
bool MemoryPool<T
>::create(const int num
) {numofMemoryNode
= num
;memoryList
= new MemoryNodeList
;memoryList
->next
= nullptr;numofmemoryList
= 1;memoryList
->memoryNode
= new MemoryNode
[numofMemoryNode
];for (int i
= 1; i
< numofMemoryNode
; i
++){memoryList
->memoryNode
[i
- 1].next
= &memoryList
->memoryNode
[i
];}memoryList
->memoryNode
[numofMemoryNode
- 1].next
= nullptr;currenetNode
= memoryList
->memoryNode
;numofAlloc
= 0;return true;
}template<class T>
void MemoryPool<T
>::destroy() {while (memoryList
) {if (memoryList
->memoryNode
) {delete[] memoryList
->memoryNode
;memoryList
->memoryNode
= nullptr;}MemoryNodeList
* pList
= memoryList
;memoryList
= memoryList
->next
;delete pList
;}numofMemoryNode
= 0;numofAlloc
= 0;numofmemoryList
= 0;
}template<class T>
T
* MemoryPool<T
>::Alloc() {if (currenetNode
== nullptr) {MemoryNodeList
* pList
= new MemoryNodeList
;numofmemoryList
++;pList
->memoryNode
= new MemoryNode
[numofMemoryNode
];for (int i
= 1; i
< numofMemoryNode
; i
++){pList
->memoryNode
[i
- 1].next
= &pList
->memoryNode
[i
];}pList
->memoryNode
[numofMemoryNode
- 1].next
= nullptr;pList
->next
= memoryList
;memoryList
= pList
;currenetNode
= memoryList
->memoryNode
;}MemoryNode
* res
= currenetNode
;currenetNode
= currenetNode
->next
;numofAlloc
++;return &(res
->element
);
}template<class T>
void MemoryPool<T
>::Free(const T
* obj
) {MemoryNode
* pNode
= (MemoryNode
*)obj
;pNode
->next
= currenetNode
;currenetNode
= pNode
;numofAlloc
--;
}
#include<iostream>
#include"MemoryPool.cpp"
using namespace std
;void main() {MemoryPool
<int> memory
;memory
.create(3);int* a1
= memory
.Alloc(); *a1
= 1;int* a2
= memory
.Alloc(); *a2
= 2;int* a3
= memory
.Alloc(); *a3
= 3;int* a4
= memory
.Alloc(); *a4
= 4;memory
.Free(a2
);memory
.Free(a1
);int* a5
= memory
.Alloc(); *a5
= 5;int* a6
= memory
.Alloc(); *a6
= 6;int* a7
= memory
.Alloc(); *a7
= 7;int* a8
= memory
.Alloc(); *a8
= 8;cout
<< "a1=" << *a1
<< endl
;cout
<< "a2=" << *a2
<< endl
;cout
<< "a3=" << *a3
<< endl
;cout
<< "a4=" << *a4
<< endl
;cout
<< "a5=" << *a5
<< endl
;cout
<< "a6=" << *a6
<< endl
;cout
<< "a7=" << *a7
<< endl
;cout
<< "a8=" << *a8
<< endl
; memory
.destroy();cout
<< "a6=" << *a6
<< endl
;system("pause");
}
學習于這位大佬
總結
以上是生活随笔為你收集整理的简易的实现对象内存池的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。