c++内存池设计

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!

===== 测试用例结束 =====
相关推荐
松涛和鸣1 分钟前
23、链式栈(LinkStack)的实现与多场景应用
linux·c语言·c++·嵌入式硬件·ubuntu
CC.GG26 分钟前
【C++】面向对象三大特性之一——继承
java·数据库·c++
Tandy12356_28 分钟前
手写TCP/IP协议栈——数据包结构定义
c语言·网络·c++·计算机网络
繁华似锦respect34 分钟前
HTTPS 中 TLS 协议详细过程 + 数字证书/签名深度解析
开发语言·c++·网络协议·http·单例模式·设计模式·https
minji...1 小时前
linux 进程控制(一) (fork进程创建,exit进程终止)
linux·运维·服务器·c++·git·算法
埃伊蟹黄面1 小时前
双指针算法
数据结构·c++·算法
Elias不吃糖1 小时前
Leetcode-10.正则表达式匹配(暴力 或 记忆暴力)
数据结构·c++·算法·leetcode·深度优先
小年糕是糕手1 小时前
【C++】类和对象(四) -- 取地址运算符重载、构造函数plus
c语言·开发语言·数据结构·c++·算法·leetcode·蓝桥杯
LXS_3571 小时前
Day 15 C++之文件操作
开发语言·c++·学习方法·改行学it
无限进步_1 小时前
基于单向链表的C语言通讯录实现分析
c语言·开发语言·数据结构·c++·算法·链表·visual studio