当前位置: 首页 > news >正文

c++内存池

实现一个简单的内存池,用于高效分配和释放固定大小的对象。

代码示例

#include <iostream>
#include <cstdlib>
#include <stack>class MemoryPool {
public:MemoryPool(size_t objectSize, size_t poolSize): objSize(objectSize), totalSize(poolSize), pool((char*)malloc(objectSize * poolSize)) {if (pool == nullptr) {throw std::bad_alloc();}// 初始化 free listfor (size_t i = 0; i < poolSize; ++i) {freeList.push(pool + i * objectSize);}}~MemoryPool() {free(pool);}void* allocate() {if (freeList.empty()) {throw std::bad_alloc();}void* ptr = freeList.top();freeList.pop();return ptr;}void deallocate(void* ptr) {freeList.push((char*)ptr);}private:size_t objSize;size_t totalSize;char* pool;std::stack<void*> freeList;
};class MyClass {
public:MyClass(int val) : value(val) {std::cout << "MyClass constructor: " << value << std::endl;}~MyClass() {std::cout << "MyClass destructor: " << value << std::endl;}int value;
};int main() {try {// 创建一个能容纳 3 个 MyClass 对象的内存池MemoryPool pool(sizeof(MyClass), 3);// 分配对象内存void* mem1 = pool.allocate();void* mem2 = pool.allocate();// 使用“定位 new”构造对象MyClass* obj1 = new(mem1) MyClass(100);MyClass* obj2 = new(mem2) MyClass(200);// 使用对象std::cout << "obj1 value: " << obj1->value << std::endl;std::cout << "obj2 value: " << obj2->value << std::endl;// 显式调用析构函数obj1->~MyClass();obj2->~MyClass();// 释放内存pool.deallocate(mem1);pool.deallocate(mem2);}catch (const std::bad_alloc& e) {std::cerr << "Memory pool allocation error: " << e.what() << std::endl;return 1;}return 0;
}

输出

MyClass constructor: 100
MyClass constructor: 200
obj1 value: 100
obj2 value: 200
MyClass destructor: 100
MyClass destructor: 200

说明

  • MemoryPool 管理固定大小的内存块,避免频繁调用 mallocfree
  • 使用“定位 new”在预分配的内存上构造对象。
  • 需要手动调用析构函数和将内存返回给内存池。

注意:这种方法适用于大量小对象的高效管理,但需要确保正确使用构造和析构函数。

http://www.xdnf.cn/news/80749.html

相关文章:

  • 调整IntelliJ IDEA中当前文件所在目录的显示位置
  • 可吸收聚合物:医疗科技与绿色未来的交汇点
  • 解决IntelliJ IDEA配置文件(application.properties)中文注释变成乱码的问题
  • linux驱动---视频播放采集架构介绍
  • 2025年数字媒体设计与文化交流国际会议 (DMACE 2025)
  • 【Python进阶】VSCode Python开发完全指南:从环境配置到高效调试
  • 【数据结构和算法】5. 堆栈和队列
  • Android Retrofit原理解析
  • map和set
  • 如何让 vscode jupyter 访问 terminal 的环境变量?
  • 【医学影像 AI】基于 AI 的远程筛查 ROP 效果评价
  • UML-网络媒体教学系统顺序图深度解析
  • Springboot+Vue实现邮箱验证功能(邮箱登录+忘记密码)
  • 嵌入式:ARM公司发展史与核心技术演进
  • AtCoder 第402场初级竞赛 A~E题解
  • 【工具变量】中国服务贸易OECD-进出口相关数据(2005-2023年)
  • 【 React 】重点知识总结 快速上手指南
  • App爬虫工具篇-mitmproxy
  • Git分支管理方案
  • 基于深度Retinex分解的低光照增强方法
  • linux复习
  • Codigger Desktop:Boby形象互动提升用户体验
  • 边缘计算盒子是什么?
  • Postman下载安装与使用汉化版教程
  • Java 8 新特性深度解析:现代编程的转折点
  • 瓦瑟斯坦差分隐私(Wasserstein DP)中的一个推导
  • 访问Maven私服的教程
  • C# byte[]字节数组常用的一些操作。
  • 基于LightGBM-TPE算法对交通事故严重程度的分析与可视化
  • 告别网页!体验更丝滑的大模型PC客户端横评