答案:C++内存池通过预分配大块内存并划分为固定大小的小块,以减少new/delete调用开销。SimpleMemoryPool类使用空闲链表管理内存块,allocate从链表取块,deallocate归还块到链表,适用于小对象频繁创建销毁场景,需配合定位new和手动析构使用,不支持变长分配但可扩展。

在C++中实现一个简单的内存池,主要目的是减少频繁调用new和delete带来的性能开销,尤其适用于需要频繁申请和释放小块内存的场景。下面介绍一种基础但实用的内存池实现方法。
内存池的基本思路
内存池预先分配一大块内存,然后按固定大小划分成多个小块。每次申请内存时,从池中取出一个空闲块;释放时,将内存块归还给池子而不是真正释放给系统。这种方式避免了堆碎片和系统调用开销。
定义内存池类结构
我们设计一个模板类SimpleMemoryPool,支持指定对象类型和预分配数量。
struct Block {
Block* next;
};
char* memory_;
Block* free_list_;
size_t block_size_;
size_t pool_size_;
public:
SimpleMemoryPool(size_t count, size_t size);
~SimpleMemoryPool();
void* allocate();
void deallocate(void* p);
};
实现构造函数与析构函数
构造函数负责分配整块内存,并将所有块链接成空闲链表。
立即学习“C++免费学习笔记(深入)”;
SimpleMemoryPool::SimpleMemoryPool(size_t count, size_t size): block_size_(size), pool_size_(count) {
memory_ = new char[count * size];
free_list_ = nullptr;
// 构建空闲链表
for (int i = count - 1; i >= 0; --i) {
Block* block = reinterpret_cast
block->next = free_list_;
free_list_ = block;
}
}
析构函数释放整个内存块。
SimpleMemoryPool::~SimpleMemoryPool() {delete[] memory_;
}
实现allocate和deallocate
allocate从空闲链表取第一个块,返回可用地址。
void* SimpleMemoryPool::allocate() {if (!free_list_) return nullptr;
Block* block = free_list_;
free_list_ = free_list_->next;
return block;
}
deallocate将内存块重新插入空闲链表。
void SimpleMemoryPool::deallocate(void* p) {if (!p) return;
Block* block = static_cast
block->next = free_list_;
free_list_ = block;
}
使用示例:
struct Point {int x, y;
Point(int a=0, int b=0) : x(a), y(b) {}
};
// 创建可容纳100个Point对象的内存池
SimpleMemoryPool pool(100, sizeof(Point));
void mem = pool.allocate();
Point p = new (mem) Point(1, 2); // 定位new
p->~Point(); // 手动调用析构
pool.deallocate(p); // 归还内存
这个简单内存池不支持变长内存分配,适合对象大小固定的场景。实际项目中可根据需要扩展支持多尺寸块、自动扩容等功能。
基本上就这些,不复杂但容易忽略细节,比如对齐问题或异常安全。初期学习用这个模型足够理解核心机制。











