KMemoryPool 内存池设计文档
1. 设计目标
- ⚡ 高效内存管理:实现O(1)时间复杂度分配/释放操作
- 🧩 碎片控制:采用双向链表+节点合并策略降低内存碎片
- 🚀 动态扩容:支持按需创建2MB内存块,最大支持10MB容量
- 🔒 安全机制:内置内存泄漏检测、双重释放保护、非法指针校验
- 📊 可视化监控:提供printStatus()实时查看内存状态
2. 核心架构
2.1 类关系图
+----------------+ +----------------+ +----------------+
| KMemoryPool |◄---► | KMemoryBlock |◄---► | KBlockNode |
+----------------+ +----------------+ +----------------+
csharp
### 2.2 类职责说明
#### ▶ KBlockNode(内存节点)
```cpp
class KBlockNode {
char* m_start; // 内存起始地址
char* m_end; // 内存结束地址
KBlockNode* m_next; // 后向指针
KBlockNode* m_prev; // 前向指针
bool m_used; // 使用标记
}
▌核心功能:
- 管理连续内存段的元数据
- 维护双向链表结构
- 支持节点分割与合并
▶ KMemoryBlock(内存块)
c
class KMemoryBlock {
std::unique_ptr<char[]> m_realAddress; // 实际内存
KBlockNode* m_startBlockNode; // 节点链表头
size_t m_blockSize; // 块大小(默认2MB)
}
▌核心功能:
- 管理物理内存的申请/释放
- 维护节点链表结构
- 支持整块内存回收检测
▶ KMemoryPool(内存池)
arduino
class KMemoryPool {
KMemoryBlock* m_blockStart; // 内存块链表头
size_t m_memorySize = 10MB; // 总容量
size_t m_blockSize = 2MB; // 块单位
size_t m_allocatedTotal; // 已分配统计
}
▌核心功能:
- 统一管理所有内存块
- 处理分配/释放请求
- 执行内存合并策略
- 异常检测与处理
3. 核心算法
3.1 内存分配流程

3.2 内存释放流程

4. 关键技术实现
4.1 节点合并算法
rust
void mergeFreeNodes(KBlockNode* node) {
// 前向合并
while (node->m_prev && !node->m_prev->m_used) {
merge(node->m_prev, node);
}
// 后向合并
while (node->m_next && !node->m_next->m_used) {
merge(node, node->m_next);
}
}
4.2 内存块回收条件
rust
bool isEntireBlockFree(KMemoryBlock* block) {
return block->m_startBlockNode->m_next == nullptr
&& !block->m_startBlockNode->m_used
&& (block->m_startBlockNode->m_end - block->m_startBlockNode->m_start) == block->m_blockSize;
}
5. 异常处理机制
异常类型 | 检测条件 | 处理方式 |
---|---|---|
内存泄漏 | 析构时m_allocatedTotal > 0 | 输出警告日志 |
双重释放 | 释放已标记未用的节点 | 抛出invalid_argument |
无效指针 | 地址不在任何块范围内 | 抛出invalid_argument |
内存不足 | 请求超过剩余容量 | 抛出bad_alloc |
6. 使用示例
6.1 基础用法
scss
KMemoryPool pool(2*1024*1024); // 初始化2MB块
void* p1 = pool.allocate(512*1024); // 分配0.5MB
pool.deallocate(p1); // 释放内存
6.2 状态监控
ini
pool.printStatus();
示例输出:
less
===== 测试用例开始 =====
[初始化后状态]
[Memory Pool Status]
申请内存池大小: 10485760 bytes
用户申请大小: 0 bytes
实际分配块大小: 0 bytes
[分配两个块后]
[Memory Pool Status]
申请内存池大小: 10485760 bytes
用户申请大小: 1572864 bytes
实际分配块大小: 2097152 bytes
Block #0 (2097152 bytes)
Node #0: [USED] 0108C040 - 0110C040 (524288 bytes)
Node #1: [USED] 0110C040 - 0120C040 (1048576 bytes)
Node #2: [FREE] 0120C040 - 0128C040 (524288 bytes)
[释放第一个块后]
[Memory Pool Status]
申请内存池大小: 10485760 bytes
用户申请大小: 1048576 bytes
实际分配块大小: 2097152 bytes
Block #0 (2097152 bytes)
Node #0: [FREE] 0108C040 - 0110C040 (524288 bytes)
Node #1: [USED] 0110C040 - 0120C040 (1048576 bytes)
Node #2: [FREE] 0120C040 - 0128C040 (524288 bytes)
[分配第三个大块后]
[Memory Pool Status]
申请内存池大小: 10485760 bytes
用户申请大小: 2621440 bytes
实际分配块大小: 4194304 bytes
Block #0 (2097152 bytes)
Node #0: [USED] 01294040 - 01414040 (1572864 bytes)
Node #1: [FREE] 01414040 - 01494040 (524288 bytes)
Block #1 (2097152 bytes)
Node #0: [FREE] 0108C040 - 0110C040 (524288 bytes)
Node #1: [USED] 0110C040 - 0120C040 (1048576 bytes)
Node #2: [FREE] 0120C040 - 0128C040 (524288 bytes)
[分配精确块大小后]
[Memory Pool Status]
申请内存池大小: 10485760 bytes
用户申请大小: 4718592 bytes
实际分配块大小: 6291456 bytes
Block #0 (2097152 bytes)
Node #0: [USED] 014A6040 - 016A6040 (2097152 bytes)
Block #1 (2097152 bytes)
Node #0: [USED] 01294040 - 01414040 (1572864 bytes)
Node #1: [FREE] 01414040 - 01494040 (524288 bytes)
Block #2 (2097152 bytes)
Node #0: [FREE] 0108C040 - 0110C040 (524288 bytes)
Node #1: [USED] 0110C040 - 0120C040 (1048576 bytes)
Node #2: [FREE] 0120C040 - 0128C040 (524288 bytes)
[成功捕获超限异常]
[WARNING] Memory leak detected: 4718592 bytes not freed!
===== 测试用例结束 =====