简易的实现对象内存池

简易的实现对象内存池


MemoryNode结构体是保存每一个申请的内存节点,然后构成一个单链表。
MemoryNodeList 结构体是保存的是每一块内存,当上一个内存块用完时,再次创建一个内存块。

numofMemoryNode:一个内存块的内存节点数量
numofmemoryList:内存块数量
numofAlloc:已经分配出去的内存数量

在这里插入图片描述
删除2 改为回收值为2的节点内存

#pragma once
template<class T>
class MemoryPool
{
public:struct MemoryNode {T element;MemoryNode* next;};struct MemoryNodeList {MemoryNode* memoryNode;MemoryNodeList* next;};MemoryPool() {currenetNode = nullptr; memoryList= nullptr;}~MemoryPool();bool create(const int num);//创建一个对象池void destroy();//释放内存T* Alloc();//分配内存void Free(const T* obj);//回收一个对象内存int getPoolSize()const { return numofmemoryList * numofMemoryNode; }bool IsCreate()const { return memoryList != nullptr; }int getAlloc()const { return numofAlloc; }
private:MemoryNodeList* memoryList;MemoryNode* currenetNode;int numofMemoryNode;int numofAlloc;int numofmemoryList;
};
#include "MemoryPool.h"
template<class T>
MemoryPool<T>::~MemoryPool() {
//防止没有人工释放内存,利用析构函数if (getPoolSize()>0||IsCreate()) {destroy();}
}template<class T>
bool MemoryPool<T>::create(const int num) {numofMemoryNode = num;memoryList = new MemoryNodeList;memoryList->next = nullptr;numofmemoryList = 1;memoryList->memoryNode = new MemoryNode[numofMemoryNode];//连成链表for (int i = 1; i < numofMemoryNode; i++){memoryList->memoryNode[i - 1].next = &memoryList->memoryNode[i];}memoryList->memoryNode[numofMemoryNode - 1].next = nullptr;currenetNode = memoryList->memoryNode;numofAlloc = 0;return true;
}template<class T>
void MemoryPool<T>::destroy() {while (memoryList) {if (memoryList->memoryNode) {delete[] memoryList->memoryNode;memoryList->memoryNode = nullptr;}MemoryNodeList* pList = memoryList;memoryList = memoryList->next;delete pList;}numofMemoryNode = 0;numofAlloc = 0;numofmemoryList = 0;
}template<class T>
T* MemoryPool<T>::Alloc() {if (currenetNode == nullptr) {MemoryNodeList* pList = new MemoryNodeList;numofmemoryList++;pList->memoryNode = new MemoryNode[numofMemoryNode];for (int i = 1; i < numofMemoryNode; i++){pList->memoryNode[i - 1].next = &pList->memoryNode[i];}pList->memoryNode[numofMemoryNode - 1].next = nullptr;pList->next = memoryList;memoryList = pList;currenetNode = memoryList->memoryNode;}MemoryNode* res = currenetNode;currenetNode = currenetNode->next;numofAlloc++;return &(res->element);
}template<class T>
void MemoryPool<T>::Free(const T* obj) {MemoryNode* pNode = (MemoryNode*)obj;pNode->next = currenetNode;currenetNode = pNode;numofAlloc--;
}
#include<iostream>
#include"MemoryPool.cpp"
using namespace std;void main() {MemoryPool<int> memory;memory.create(3);int* a1 = memory.Alloc(); *a1 = 1;int* a2 = memory.Alloc(); *a2 = 2;int* a3 = memory.Alloc(); *a3 = 3;int* a4 = memory.Alloc(); *a4 = 4;memory.Free(a2);memory.Free(a1);int* a5 = memory.Alloc(); *a5 = 5;int* a6 = memory.Alloc(); *a6 = 6;int* a7 = memory.Alloc(); *a7 = 7;int* a8 = memory.Alloc(); *a8 = 8;cout << "a1=" << *a1 << endl;cout << "a2=" << *a2 << endl;cout << "a3=" << *a3 << endl;cout << "a4=" << *a4 << endl;cout << "a5=" << *a5 << endl;cout << "a6=" << *a6 << endl;cout << "a7=" << *a7 << endl;cout << "a8=" << *a8 << endl; memory.destroy();cout << "a6=" << *a6 << endl;system("pause");
}

学习于这位大佬

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569359.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

连接符合赋值运算符

字符串运算符 以.的形式来连接如&#xff1a;$a.$b; $aacb; $a.efg $aabcefg .相当与$a$a.efg mt_rand()&#xff1b;随机函数 <?php // mt_rand(int $min,int $max) 产生随机数函数 $min ,$max $str"请输入验证码&#xff1a;"; $str.<span style"…

Linux关机操作

转载于:https://www.cnblogs.com/hlc-123/p/10958108.html

JAVA:贪吃蛇源代码

嘿嘿 新手来 表现了&#xff01;&#xff01;&#xff01; 2019年结束 游戏截图&#xff1a; 文件布局&#xff1a; 代码分享 用到的一些全局变量 //全局变量 public class Global {public static final int RECT_WIDTH20;//每个小方格的长宽public static final int WIDTH…

结构

结构 值类型中除了枚举类型都是结构类型的派生类型 由于结构是值类型&#xff0c;并且直接存储数据&#xff0c;因此&#xff0c;在一个对象的主要成员为数据且数据量不大的情况下&#xff0c;使用结构会带来更好的性能。 public struct Address {public string Name;public st…

10 字符串相关操作

# ### 字符串的相关操作 #(1)字符串的拼接 str1 "我爱你" str2 "美丽的祖国" res str1 str2 print(res) str1 str2 # str1 str1 str2 print(str1)# (2)字符串的重复 * str1 "重要的事情说三遍" res str1 * 3 print(res)# (3)字符串跨…

hbase-1.3.2安装

上传安装包hbase-1.3.2-bin.tar.gz解压安装包tar -zxvf /root/hbase-1.3.2-bin.tar.gz -C /usr/local/ 修改配置文件修改hbase-env.shvi hbase-env.sh 修改为以下内容&#xff1a; export JAVA_HOME/usr/local/jdk1.8.0_102 export HBASE_MANAGES_ZKfalse 表示不引用 hbase 自带…

深拷贝的三种方式

JSON方法 var obj2 JSON.parse&#xff08;JSON.stringify(obj1)&#xff09;//深拷贝递归(自己调用自己)方法 判断第一层属性的类型&#xff0c;多层拷贝对象的属性 var obj1 { name: zs, age: 18, dog: { name: 金毛, age: 2 }, friends: [ww, lil] } var obj2 {}; functio…

AppiumForWin安装

尝试安装Windows版本的Appium参考&#xff1a;http://www.cnblogs.com/fnng/p/4540731.html第一步&#xff1a;安装nodehttps://nodejs.org/en/安装成功后使用&#xff1a;node -v&#xff0c;进行验证第二步&#xff1a;安装Appium下面的方法失败&#xff1a;原因下载不成功&a…

剑指offer-二进制中1的个数

题目描述 输入一个整数&#xff0c;输出该数二进制表示中1的个数。其中负数用补码表示。1 class Solution {2 public:3 int NumberOf1(int n) {4 int count 0;5 while(n)6 {7 count ;8 n (n - 1) & n;9 …

activiti5第一弹-----基本的activiti示例

建立一个普通的javaSE工程&#xff0c;工程的目录结构如下&#xff1a;需要的jar包如下&#xff1a; 在config文件夹下创建log4j.properties用来输入日志&#xff0c;内容如下&#xff1a; log4j.rootLoggerINFO, CA # ConsoleAppender log4j.appender.CAorg.apache.log4j.Cons…

activiti5第二弹----使用activiti5提供的测试类进行测试

在前文的基础上改变测试方式 package activiti_001;import org.activiti.engine.impl.test.PluggableActivitiTestCase; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.Task; import org.activiti.engine.test.Deployment; import org…

Android在布局XML中的空格转义符(占位符)

普通的英文半角空格 &#xA0; no-break space &#xff08;普通的英文半角空格但不换行&#xff09; 中文全角空格 &#xff08;一个中文宽度&#xff09; &ensp; en空格 &#xff08;半个中文宽度&#xff09; &emsp; em空格 &#xff08;一个中文宽…

activiti5第三弹-----------脚本任务

首先是流程定义图&#xff1a; 重点关注一下流程节点中 Script Task 节点的 properties中的Main config 这里可以选择不同的脚本语言&#xff0c;由于其他的部怎么会就用javascript来吧。 从图中可以看出只是定义了一个变量x&#xff0c;它的值为 a; 很多人都说这样定义了这个…

Jmeter之性能测试类型

Jmeter之性能测试类型 pipe-clean test在测试环境预先跑确定脚本准确性单用户跑获取baseline容量测试经典的性能测试类型获取系统稳定运行时最大的吞吐量/并发数/响应时间时尽量模拟真实情况&#xff0c;比如加入用户思考时间等压力测试把系统弄挂除非系统无响应&#xff0c;响…

activiti5第四弹----serviceTask中的java服务任务

activiti.cfg.xml内容&#xff1a; <?xml version"1.0"?> <beans default-lazy-init"false"xsi:schemaLocation" http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd http://ww…

1 ~ express ~ 初始化。安装第三方模块express。中间件

一&#xff0c;初始化 二&#xff0c;安装第三方模块express 三&#xff0c;安装中间件 1&#xff0c;bodyParser : 解析 post 请求数据 2&#xff0c;cookies : 读写 cookie 3&#xff0c;swig &#xff1a;模板解析引擎 4&#xff0c;mongoose &#xff1a; 操作 mongodb 数据…

activiti5第五弹 serviceTask中的webserviceTask 以及 shellTask

web service task是BPMN2.0中的一种任务类型&#xff0c;在activiti5中它并没有专门的标签表示&#xff0c;而是使用了service task 来表示。而且有很多要配置的内容是无法用图形化工具来完成的。要使用web service task&#xff0c;当然要先有web service。所以首先要编写一个…

bloc

示例分为两个文件 main.dart import package:flutter/material.dart;import bloc.dart;void main()>runApp(MyApp());class MyApp extends StatelessWidget { override Widget build(BuildContext context) { return MaterialApp( home: HomePage(), ); }}cla…

activiti5第六弹 手动任务、接收任务、邮件任务

手动任务和接收任务几乎不在程序中做什么事情---只是在流程的历史中留下一点痕迹&#xff0c;表明流程是走过某些节点的。。。而且这两个任务是无法用taskservice查询到的 但是接收任务比手动任务多一个功能&#xff0c;就是确认功能。。。 activiti.cfg.xml配置 <?xml v…

手把手教你用原始方式上传项目至GitHub

小编GitHub&#xff1a;https://github.com/ds1889 首先你得注册一个自己的GitHub账号&#xff0c;注册网址&#xff1a;https://github.com/join 有了自己的账号以后&#xff0c;就可以进行登录&#xff0c;开始创建一个新的项目 创建一个新的项目&#xff0c;填写项目名称&am…