C++中内存池的简单原理及实现详解 📅 2026/7/6 1:52:29 为什么要用内存池C程序默认的内存管理newdeletemallocfree会频繁地在堆上分配和释放内存导致性能的损失产生大量的内存碎片降低内存的利用率。默认的内存管理因为被设计的比较通用所以在性能上并不能做到极致。因此很多时候需要根据业务需求设计专用内存管理器便于针对特定数据结构和使用场合的内存管理比如内存池。内存池原理内存池的思想是在真正使用内存之前预先申请分配一定数量、大小预设的内存块留作备用。当有新的内存需求时就从内存池中分出一部分内存块若内存块不够再继续申请新的内存当内存释放后就回归到内存块留作后续的复用使得内存使用效率得到提升一般也不会产生不可控制的内存碎片。内存池设计算法原理1.预申请一个内存区chunk将内存中按照对象大小划分成多个内存块block2.维持一个空闲内存块链表通过指针相连标记头指针为第一个空闲块3.每次新申请一个对象的空间则将该内存块从空闲链表中去除更新空闲链表头指针4.每次释放一个对象的空间则重新将该内存块加到空闲链表头5.如果一个内存区占满了则新开辟一个内存区维持一个内存区的链表同指针相连头指针指向最新的内存区新的内存块从该区内重新划分和申请如图所示内存池实现memory_pool.hpp123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124#ifndef _MEMORY_POOL_H_#define _MEMORY_POOL_H_#include stdint.h#include mutextemplatesize_tBlockSize,size_tBlockNum 10classMemoryPool{public:MemoryPool(){std::lock_guardstd::mutex lk(mtx);// avoid race condition// init empty memory pointerfree_block_head NULL;mem_chunk_head NULL;}~MemoryPool(){std::lock_guardstd::mutex lk(mtx);// avoid race condition// destruct automaticallyMemChunk* p;while(mem_chunk_head){p mem_chunk_head-next;deletemem_chunk_head;mem_chunk_head p;}}void* allocate(){std::lock_guardstd::mutex lk(mtx);// avoid race condition// allocate one object memory// if no free block in current chunk, should create new chunkif(!free_block_head){// malloc mem chunkMemChunk* new_chunk newMemChunk;new_chunk-next NULL;// set this chunks first block as free block headfree_block_head (new_chunk-blocks[0]);// link the new chunks all blocksfor(inti 1; i BlockNum; i)new_chunk-blocks[i - 1].next (new_chunk-blocks[i]);new_chunk-blocks[BlockNum - 1].next NULL;// final block next is NULLif(!mem_chunk_head)mem_chunk_head new_chunk;else{// add new chunk to chunk listmem_chunk_head-next new_chunk;mem_chunk_head new_chunk;}}// allocate the current free block to the objectvoid* object_block free_block_head;free_block_head free_block_head-next;returnobject_block;}void* allocate(size_tsize){std::lock_guardstd::mutex lk(array_mtx);// avoid race condition for continuous memory// calculate objects numintn size / BlockSize;// allocate n objects in continuous memory// FIXME: make sure n 0void* p allocate();for(inti 1; i n; i)allocate();returnp;}voiddeallocate(void* p){std::lock_guardstd::mutex lk(mtx);// avoid race condition// free object memoryFreeBlock* block static_castFreeBlock*(p);block-next free_block_head;// insert the free block to headfree_block_head block;}private:// free node block, every block size exactly can contain one objectstructFreeBlock{unsignedchardata[BlockSize];FreeBlock* next;};FreeBlock* free_block_head;// memory chunk, every chunk contains blocks number with fixed BlockNumstructMemChunk{FreeBlock blocks[BlockNum];MemChunk* next;};MemChunk* mem_chunk_head;// thread safe relatedstd::mutex mtx;std::mutex array_mtx;};#endif // !_MEMORY_POOL_H_main.cpp123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384#include iostream#include memory_pool.hppclassMyObject{public:MyObject(intx): data(x){//std::cout contruct object std::endl;}~MyObject(){//std::cout destruct object std::endl;}intdata;// override new and delete to use memory poolvoid* operatornew(size_tsize);voidoperatordelete(void* p);void* operatornew[](size_tsize);voidoperatordelete[](void* p);};// define memory pool with block size as class sizeMemoryPoolsizeof(MyObject), 3 gMemPool;void* MyObject::operatornew(size_tsize){//std::cout new object space std::endl;returngMemPool.allocate();}voidMyObject::operatordelete(void* p){//std::cout free object space std::endl;gMemPool.deallocate(p);}void* MyObject::operatornew[](size_tsize){// TODO: not supported continuous memoery pool for now//return gMemPool.allocate(size);returnNULL;}voidMyObject::operatordelete[](void* p){// TODO: not supported continuous memoery pool for now//gMemPool.deallocate(p);}intmain(intargc,char* argv[]){MyObject* p1 newMyObject(1);std::cout p1 p1 p1-data std::endl;MyObject* p2 newMyObject(2);std::cout p2 p2 p2-data std::endl;deletep2;MyObject* p3 newMyObject(3);std::cout p3 p3 p3-data std::endl;MyObject* p4 newMyObject(4);std::cout p4 p4 p4-data std::endl;MyObject* p5 newMyObject(5);std::cout p5 p5 p5-data std::endl;MyObject* p6 newMyObject(6);std::cout p6 p6 p6-data std::endl;deletep1;deletep2;//delete p3;deletep4;deletep5;deletep6;getchar();return0;}运行结果p1 00000174BEDE0440 1p2 00000174BEDE0450 2p3 00000174BEDE0450 3p4 00000174BEDE0460 4p5 00000174BEDD5310 5p6 00000174BEDD5320 6可以看到内存地址是连续并且回收一个节点后依然有序地开辟内存对象先开辟内存再构造先析构再释放内存注意在内存分配和释放的环节需要加锁来保证线程安全还没有实现对象数组的分配和释放https://gitee.com/sdger1/gfd/blob/master/IUbeb.mdhttps://gitee.com/sdger1/gfd/blob/master/gFQji.mdhttps://gitee.com/sdger1/gfd/blob/master/NGqDL.mdhttps://gitee.com/sdger1/gfd/blob/master/VmTsR.mdhttps://gitee.com/sdger1/gfd/blob/master/iODwe.mdhttps://gitee.com/sdger1/gfd/blob/master/OaxTf.mdhttps://gitee.com/sdger1/gfd/blob/master/xHOGb.mdhttps://gitee.com/sdger1/gfd/blob/master/sltat.mdhttps://gitee.com/sdger1/gfd/blob/master/ssipT.mdhttps://gitee.com/sdger1/gfd/blob/master/ZUuiD.mdhttps://gitee.com/sdger1/gfd/blob/master/zJUvh.mdhttps://gitee.com/sdger1/gfd/blob/master/PNTWl.mdhttps://gitee.com/sdger1/gfd/blob/master/PsIep.mdhttps://gitee.com/sdger1/gfd/blob/master/mHSIE.mdhttps://gitee.com/sdger1/gfd/blob/master/cVqSE.mdhttps://gitee.com/sdger1/gfd/blob/master/meOOp.mdhttps://gitee.com/sdger1/gfd/blob/master/otVqz.mdhttps://gitee.com/sdger1/gfd/blob/master/jRvhC.mdhttps://gitee.com/sdger1/gfd/blob/master/SYHiR.mdhttps://gitee.com/sdger1/gfd/blob/master/CPXGd.mdhttps://gitee.com/sdger1/gfd/blob/master/xqItR.mdhttps://gitee.com/sdger1/gfd/blob/master/sbGBK.mdhttps://gitee.com/sdger1/gfd/blob/master/oVDbK.mdhttps://gitee.com/sdger1/gfd/blob/master/hcTzi.mdhttps://gitee.com/sdger1/gfd/blob/master/jUICZ.mdhttps://gitee.com/sdger1/gfd/blob/master/itnJK.mdhttps://gitee.com/sdger1/gfd/blob/master/bXswt.mdhttps://gitee.com/sdger1/gfd/blob/master/bjYJd.mdhttps://gitee.com/sdger1/gfd/blob/master/KXqmy.mdhttps://gitee.com/sdger1/gfd/blob/master/laLWX.mdhttps://gitee.com/sdger1/gfd/blob/master/Auddm.mdhttps://gitee.com/sdger1/gfd/blob/master/nIwVc.mdhttps://gitee.com/sdger1/gfd/blob/master/NAaOE.mdhttps://gitee.com/sdger1/gfd/blob/master/ZwWFg.mdhttps://gitee.com/sdger1/gfd/blob/master/VcSOW.mdhttps://gitee.com/sdger1/gfd/blob/master/QuUmw.mdhttps://gitee.com/sdger1/gfd/blob/master/xdBXL.mdhttps://gitee.com/sdger1/gfd/blob/master/APGaU.mdhttps://gitee.com/sdger1/gfd/blob/master/hfeOb.mdhttps://gitee.com/sdger1/gfd/blob/master/GqQZJ.mdhttps://gitee.com/sdger1/gfd/blob/master/tPZOM.mdhttps://gitee.com/sdger1/gfd/blob/master/LyyhN.mdhttps://gitee.com/sdger1/gfd/blob/master/rbLLV.mdhttps://gitee.com/sdger1/gfd/blob/master/ySagR.mdhttps://gitee.com/sdger1/gfd/blob/master/iOaQl.mdhttps://gitee.com/sdger1/gfd/blob/master/ntgWQ.mdhttps://gitee.com/sdger1/gfd/blob/master/BDPyQ.mdhttps://gitee.com/sdger1/gfd/blob/master/STISE.mdhttps://gitee.com/sdger1/gfd/blob/master/keNlX.mdhttps://gitee.com/sdger1/gfd/blob/master/pZhlh.mdhttps://gitee.com/sdger1/gfd/blob/master/NfStS.mdhttps://gitee.com/sdger1/gfd/blob/master/xsLJG.mdhttps://gitee.com/sdger1/gfd/blob/master/GmvQi.mdhttps://gitee.com/sdger1/gfd/blob/master/OhZkn.mdhttps://gitee.com/sdger1/gfd/blob/master/lUnPw.mdhttps://gitee.com/sdger1/gfd/blob/master/JCtsK.mdhttps://gitee.com/sdger1/gfd/blob/master/zWJqZ.mdhttps://gitee.com/sdger1/gfd/blob/master/dybxu.mdhttps://gitee.com/sdger1/gfd/blob/master/ircGP.mdhttps://gitee.com/sdger1/gfd/blob/master/SLtgb.mdhttps://gitee.com/sdger1/gfd/blob/master/kfVFz.mdhttps://gitee.com/sdger1/gfd/blob/master/jsHfF.mdhttps://gitee.com/sdger1/gfd/blob/master/hscdn.mdhttps://gitee.com/sdger1/gfd/blob/master/vKfEU.mdhttps://gitee.com/sdger1/gfd/blob/master/nkFDa.mdhttps://gitee.com/sdger1/gfd/blob/master/QhKht.mdhttps://gitee.com/sdger1/gfd/blob/master/SdDPc.mdhttps://gitee.com/sdger1/gfd/blob/master/GJIEH.mdhttps://gitee.com/sdger1/gfd/blob/master/NsLGU.mdhttps://gitee.com/sdger1/gfd/blob/master/EUdkX.mdhttps://gitee.com/sdger1/gfd/blob/master/DOlhD.mdhttps://gitee.com/sdger1/gfd/blob/master/FscsK.mdhttps://gitee.com/sdger1/gfd/blob/master/AIpBc.mdhttps://gitee.com/sdger1/gfd/blob/master/hpYLZ.mdhttps://gitee.com/sdger1/gfd/blob/master/dJcDk.mdhttps://gitee.com/sdger1/gfd/blob/master/AramM.mdhttps://gitee.com/sdger1/gfd/blob/master/DQDyw.mdhttps://gitee.com/sdger1/gfd/blob/master/kicEg.mdhttps://gitee.com/sdger1/gfd/blob/master/NWFGp.mdhttps://gitee.com/sdger1/gfd/blob/master/pyPQq.mdhttps://gitee.com/sdger1/gfd/blob/master/miVts.mdhttps://gitee.com/sdger1/gfd/blob/master/BDWNq.mdhttps://gitee.com/sdger1/gfd/blob/master/cywIV.mdhttps://gitee.com/sdger1/gfd/blob/master/fYcDo.mdhttps://gitee.com/sdger1/gfd/blob/master/NUmLu.mdhttps://gitee.com/sdger1/gfd/blob/master/KAvgp.mdhttps://gitee.com/sdger1/gfd/blob/master/ijXsJ.mdhttps://gitee.com/sdger1/gfd/blob/master/XpMox.mdhttps://gitee.com/sdger1/gfd/blob/master/abOwN.mdhttps://gitee.com/sdger1/gfd/blob/master/qydmX.mdhttps://gitee.com/sdger1/gfd/blob/master/hPOiU.mdhttps://gitee.com/sdger1/gfd/blob/master/grvVT.mdhttps://gitee.com/sdger1/gfd/blob/master/owqfj.mdhttps://gitee.com/sdger1/gfd/blob/master/tawNi.mdhttps://gitee.com/sdger1/gfd/blob/master/dfmlf.mdhttps://gitee.com/sdger1/gfd/blob/master/GyeSj.mdhttps://gitee.com/sdger1/gfd/blob/master/HBbcU.mdhttps://gitee.com/sdger1/gfd/blob/master/ztFuV.mdhttps://gitee.com/sdger1/gfd/blob/master/JXGVb.mdhttps://gitee.com/sdger1/gfd/blob/master/TznMi.mdhttps://gitee.com/sdger1/gfd/blob/master/AWtsK.mdhttps://gitee.com/sdger1/gfd/blob/master/jXMvJ.mdhttps://gitee.com/sdger1/gfd/blob/master/CvUMt.mdhttps://gitee.com/sdger1/gfd/blob/master/MFoeB.mdhttps://gitee.com/sdger1/gfd/blob/master/jQXwi.mdhttps://gitee.com/sdger1/gfd/blob/master/tEmYe.mdhttps://gitee.com/sdger1/gfd/blob/master/TOcZV.mdhttps://gitee.com/sdger1/gfd/blob/master/bdFww.mdhttps://gitee.com/sdger1/gfd/blob/master/lRAVz.mdhttps://gitee.com/sdger1/gfd/blob/master/PCeiD.mdhttps://gitee.com/sdger1/gfd/blob/master/nWGbq.mdhttps://gitee.com/sdger1/gfd/blob/master/VOWYU.mdhttps://gitee.com/sdger1/gfd/blob/master/jjolD.mdhttps://gitee.com/sdger1/gfd/blob/master/fmvxV.mdhttps://gitee.com/sdger1/gfd/blob/master/KEebL.mdhttps://gitee.com/sdger1/gfd/blob/master/bUUMd.mdhttps://gitee.com/sdger1/gfd/blob/master/OJUFd.mdhttps://gitee.com/sdger1/gfd/blob/master/ywaAt.mdhttps://gitee.com/sdger1/gfd/blob/master/LpepO.mdhttps://gitee.com/sdger1/gfd/blob/master/zxQSp.mdhttps://gitee.com/sdger1/gfd/blob/master/MlXGo.mdhttps://gitee.com/sdger1/gfd/blob/master/FpnAd.mdhttps://gitee.com/sdger1/gfd/blob/master/keBpq.mdhttps://gitee.com/sdger1/gfd/blob/master/OyoZb.mdhttps://gitee.com/sdger1/gfd/blob/master/ooKHv.mdhttps://gitee.com/sdger1/gfd/blob/master/SqqOG.mdhttps://gitee.com/sdger1/gfd/blob/master/SFPXh.mdhttps://gitee.com/sdger1/gfd/blob/master/lVgFB.mdhttps://gitee.com/sdger1/gfd/blob/master/gJHRS.mdhttps://gitee.com/sdger1/gfd/blob/master/YLFfy.mdhttps://gitee.com/sdger1/gfd/blob/master/yIEYN.mdhttps://gitee.com/sdger1/gfd/blob/master/XYiSn.md