实现内存池基本思路,话不多说上干货:
#include <iostream>
#include <vector>
struct Memory_Blocks
{
void* memory;
bool isAllocated;
Memory_Blocks(int nSize) :memory(malloc(nSize)), isAllocated(false) {}
~Memory_Blocks()
{
free(memory);
}
};
class MemoryPool
{
public:
MemoryPool(int nSize) :nBlockSize(nSize) {}
//分配内存
void* allocateMemory()
{
for (auto block: memoryBlocks)
{
if (!block->isAllocated)
{
block->isAllocated = true;
return block->memory;
}
}
//如果没有可用内存,重新分配一块
Memory_Blocks* newBlock = new Memory_Blocks(nBlockSize);
memoryBlocks.push_back(newBlock);
newBlock->isAllocated = true;
return newBlock->memory;
}
//释放内存块
void dellocate(void* ptr)
{
for (auto block:memoryBlocks )
{
if (block->memory == ptr)
{
block->isAllocated = false;
break;
}
}
}
~MemoryPool()
{
for (auto block:memoryBlocks)
{
delete block;
}
}
private:
std::vector<Memory_Blocks*> memoryBlocks;
int nBlockSize;
};
int main()
{
MemoryPool pool(1024);
int* ptr = (int*)pool.allocateMemory();
*ptr = 10;
std::cout << "value=" << *ptr << std::endl;
pool.dellocate(ptr);
getchar();
}