日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

简易的实现对象内存池

發布時間:2025/3/15 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 简易的实现对象内存池 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡易的實現對象內存池


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"); }

學習于這位大佬

總結

以上是生活随笔為你收集整理的简易的实现对象内存池的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。