CN114489592A - 一种内存管理库的实现方法及内存模型 - Google Patents
一种内存管理库的实现方法及内存模型 Download PDFInfo
- Publication number
- CN114489592A CN114489592A CN202111604677.2A CN202111604677A CN114489592A CN 114489592 A CN114489592 A CN 114489592A CN 202111604677 A CN202111604677 A CN 202111604677A CN 114489592 A CN114489592 A CN 114489592A
- Authority
- CN
- China
- Prior art keywords
- memory
- block
- reference count
- memory management
- model
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 230000015654 memory Effects 0.000 title claims abstract description 349
- 238000000034 method Methods 0.000 title claims abstract description 30
- 230000006870 function Effects 0.000 abstract description 7
- 230000007547 defect Effects 0.000 abstract description 2
- 238000013467 fragmentation Methods 0.000 abstract description 2
- 238000006062 fragmentation reaction Methods 0.000 abstract description 2
- 238000007726 management method Methods 0.000 description 56
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000010586 diagram Methods 0.000 description 1
- 238000013024 troubleshooting Methods 0.000 description 1
- 238000012795 verification Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
为了克服现有技术的不足,本发明提供了一种内存管理库的实现方法及内存模型,包括:一个内存模型:该内存模型在申请内存时,通过分配额外的内存空间构建用于内存管理的内存模型;并通过大小固定的内存管理块,定义保存内存块的起始地址、引用计数,并且在使用内存时引用计数加1,使用后减1。本发明统一了接口mem_ref/mem_unref,使得不管是哪里申请的内存,在使用前调用mem_ref,在使用后调用mem_unref即可,简化了使用逻辑;本发明能够快速定位因踩内存导致程序崩溃、快速定位内存泄露的问题,还能够解决因频繁申请释放内存导致内存碎片问题,并且兼容C的malloc函数及C++new操作符。
Description
技术领域
本发明涉及一种内存管理库的实现方法及内存模型以及内存模型,属于计算机技术领域。
背景技术
在编程的过程中,几乎无时无刻不在使用内存,我们使用变量,调用函数,申请空间存放我们的数据,都是在对内存进行操作。
但是,在C/C++内存操作时,使用原生接口malloc/free接口,容易导致malloc/free使用不配对,特别是当使用指针作为函数参数的时候,在哪里调用free函数去释放内存就会一个隐患,导致内存多次释放或没有释放;同时,使用原生接口malloc/free接口,定位内存泄露问题也很困难;而且,用原生接口malloc/free接口,容易出现内存访问越界导致踩内存而系统缺少相关的返回值,开发人员完全不知道这情况,再而出现各种疑难的问题。
现有技术中的内存操作容易出现踩内存、内存多次释放、内存没有释放的问题,而且在内存泄露时排查困难;所以,一种能够解决上述问题的内存管理库的实现方法及内存模型亟待研发。
发明内容
为了克服现有技术的不足,本发明提供了一种内存管理库的实现方法及内存模型,用于解决前述技术问题中的至少一个。
具体地,其技术方案如下:
一种内存管理库的实现方法,包括:
一个内存模型:该内存模型在申请内存时,通过分配额外的内存空间构建用于内存管理的内存模型;
并通过大小固定的内存管理块,定义保存内存块的起始地址、引用计数,并且在使用内存时引用计数加1,使用后减1。
所述“通过分配额外的内存空间构建用于内存管理的内存模型”,包括:
通过所述内存模型中的内存管理块管理内存块的大小、内存操作信息,以查看内存的使用情况;
并根据所述用内存管理块记录内存的引用情况,释放所述内存。
所述“通过分配额外的内存空间构建用于内存管理的内存模型”,包括:
通过内存模型中大小固定的校验位,保存特定的magic num,用于在对内存操作时的校验。
当系统发生踩内存时,申请的两块内存间会发生重叠,通过标志位字段,判断出踩内存的发生。
所述的一种内存管理库的实现方法,还包括,根据所述用内存管理块记录内存的引用情况,记录内存分配或释放的日志的步骤:
打开log开关,打印所述内存操作信息,排查内存情况;
打印队列中的内存信息。
所述“根据所述用内存管理块记录内存的引用情况,释放所述内存”,包括:
根据内存指针计算所述内存管理模块的首地址;
增加内存引用计数,表征内存引用次数;
当内存引用计数的数值大于等于1则所述ptr的位置是所述内存管理模块的首地址,获取当前所述内存引用计数;同时记录memref,memunerf接口的调用情况。
所述“根据所述用内存管理块记录内存的引用情况,并释放所述内存”,还包括:
当所述内存引用计数的值从1到2,将所述引用计数的值加1,而非重新申请内存;
当所述内存引用计数的值从2到1,将引用计数减1,而非释放内存。
所述的一种内存管理库的实现方法,还包括:对所述内存块写入内容的步骤:
根据ptr计算内存管理块的首地址;
当,所述引用计数大于等于1且ptr已赋值内存管理块记录的内存块首地址且内存管理块记录的内存块大小大于等于要写入的内存的偏移量与要写入内容的内存大小之和时:
将要写的内容拷贝到内存块的首地址与偏移量中。
所述的一种内存管理库的实现方法,还包括:对所述内存块读出内容的步骤:
根据ptr计算所述内存管理块的首地址;
当,所述引用计数大于等于1且ptr已赋值内存管理块记录的内存块首地址且内存管理块记录的内存块大小大于等于偏移量与要读的内容的大小之和时:
将首地址与偏移量的内容拷贝到读数据的内存。
一种内存管理库的内存模型,包括:
内存管理模块;
内存块,设置在所述内存管理模块的后侧,用于指代所述申请内存;
校验位,设置在所述内存块的后侧,用于对内存操作进行校验;
所述内存管理模块具有固定的大小,用于定义保存内存块的起始地址址、引用计数、内存块的大小、内存操作信息。
本发明至少具有以下有益效果:
本发明所述的复盘方法,通过构建一个内存模型,使在申请内存时,通过分配额外的内存空间构建用于内存管理的内存模型;并通过大小固定的内存管理块,定义保存内存块的起始地址、引用计数,并且在使用内存时引用计数加1,使用后减1;本发明通过上述方法,统一了接口mem_ref/mem_unref,使得不管是哪里申请的内存,在使用前调用mem_ref,在使用后调用mem_unref即可,简化使用逻辑;并且增加内存标志位的校验,当发生内存访问越界时,会返回错误信息,提醒开发人员;而且,本发明增加打印信息,在排查内存泄露问题时,可以打开log开关,打印对内存进行操作的函数的信息,可以方便的分辨没有释放的内存,同时还可以查看内存漏释放的次数,和没有释放内存的总字节数;本发明能够快速定位因踩内存导致程序崩溃、快速定位内存泄露的问题,还能够解决因频繁申请释放内存导致内存碎片问题,简化开发者对内存申请释放使用逻辑,并且兼容C的malloc函数及C++new操作符。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本发明的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
图1为本发明所述的内存模型的结构示意图;
图2为本发明所述动态申请内存的流程图;
图3为本发明所述内存标志位的检验过程流程图;
图4为本发明中判断内存是否被引用的流程图;
图5为本发明所述写内存的流程图;
图6为本发明所述读内存的流程图;
图7为本发明所述内存库的初始化流程图;
图8为输出内存信息流程图。
具体实施方式
本领域技术人员可以理解实施场景中的装置中的模块可以按照实施场景描述进行分布于实施场景的装置中,也可以进行相应变化位于不同于本实施场景的一个或多个装置中。上述实施场景的模块可以合并为一个模块,也可以进一步拆分成多个子模块。
为了解决现有技术的问题,本发明公开以下实施例:
本发明提供一种实施例:
如图1,一种内存管理库的内存模型,包括:内存管理模块100、内存块200、校验位300;其中,内存块200设置在所述内存管理模块100的后侧,用于指代所述申请内存;校验位300设置在所述内存块200的后侧,用于对内存操作进行校验;所述内存管理模块100具有固定的大小,用于定义保存内存块的起始地址址、引用计数、内存块的大小、内存操作信息。
在申请内存时,额外分配两块空间进行内存管理;其中,内存管理块的大小固定,用于定义保存内存块的起始地址、引用计数、内存块的大小、内存操作信息的结构体;内存块为实际可用的内存,就是申请的内存;校验位大小固定,保存特定的magic num,用于在对内存操作时的校验,如果踩到其他内存能第一时间返回错误信息。
本发明提供一种实施例:
如图2-8,一种内存管理库的实现方法,包括:一个内存模型:该内存模型在申请内存时,通过分配额外的内存空间构建用于内存管理的内存模型;并通过大小固定的内存管理块,定义保存内存块的起始地址、引用计数,并且在使用内存时引用计数加1,使用后减1;根据所述用内存管理块记录内存的引用情况,记录内存分配或释放的日志。
在进行“通过分配额外的内存空间构建用于内存管理的内存模型”时:通过所述内存模型中的内存管理块管理内存块的大小、内存操作信息,以查看内存的使用情况;并根据所述用内存管理块记录内存的引用情况,释放所述内存。
在进行“通过分配额外的内存空间构建用于内存管理的内存模型”,包括:通过内存模型中大小固定的校验位,保存特定的magic num,用于在对内存操作时的校验;当系统发生踩内存时,申请的两块内存间会发生重叠,通过标志位字段,判断出踩内存的发生。
根据所述用内存管理块记录内存的引用情况,记录内存分配或释放的日志的步骤为:打开log开关,打印所述内存操作信息,排查内存情况;打印队列中的内存信息。
根据所述用内存管理块记录内存的引用情况,释放所述内存时,可以通过以下步骤实现:
根据内存指针计算所述内存管理模块的首地址;增加内存引用计数,表征内存引用次数;
当内存引用计数的数值大于等于1则所述ptr的位置是所述内存管理模块的首地址,获取当前所述内存引用计数;同时记录memref,memunerf接口的调用情况;当所述内存引用计数的值从1到2,将所述引用计数的值加1,而非重新申请内存;当所述内存引用计数的值从2到1,将引用计数减1,而非释放内存。
如图5,对所述内存块写入内容时,先根据ptr计算内存管理块的首地址;当,所述引用计数大于等于1且ptr已赋值内存管理块记录的内存块首地址且内存管理块记录的内存块大小大于等于要写入的内存的偏移量与要写入内容的大小之和时:将要写的内容拷贝到内存块的首地址与偏移量中。
如图6,对所述内存块读出内容时,根据ptr计算所述内存管理块的首地址;当,所述引用计数大于等于1且ptr已赋值内存管理块记录的内存块首地址且内存管理块记录的内存块大小大于等于偏移量与要读的内容的大小之和时:将首地址与偏移量的内容拷贝到读数据的内存。
本发明对malloc和free进行封装,对new和delete运算符进行重载;增加了引用计数,在使用内存时引用计数加1,使用后减1,防止内存没有释放、重复释放;增加内存标志位的校验,防止踩内存,还能查看内存漏释放的次数,和没有释放内存的总字节数;同时,增加记录内存分配释放日志信息,在排查内存泄露问题时,可以打开log开关,打印哪些函数对内存进行了操作的信息,可以看到哪里没有释放。本发明通过上述技术手段,解决了现有技术中内存操作容易出现踩内存、内存多次释放、内存没有释放,内存泄露问题排查难等问题。
以上公开的仅为本发明的几个具体实施场景,但是,本发明并非局限于此,任何本领域的技术人员能思之的变化都应落入本发明的保护范围。上述本发明序号仅仅为了描述,不代表实施场景的优劣。
Claims (10)
1.一种内存管理库的实现方法,其特征在于,包括:
一个内存模型:该内存模型在申请内存时,通过分配额外的内存空间构建用于内存管理的内存模型;
并通过大小固定的内存管理块,定义保存内存块的起始地址、引用计数,并且在使用内存时引用计数加1,使用后减1。
2.根据权利要求1所述的一种内存管理库的实现方法,其特征在于,所述“通过分配额外的内存空间构建用于内存管理的内存模型”,包括:
通过所述内存模型中的内存管理块管理内存块的大小、内存操作信息,以查看内存的使用情况;
并根据所述用内存管理块记录内存的引用情况,释放所述内存。
3.根据权利要求1所述的一种内存管理库的实现方法,其特征在于,所述“通过分配额外的内存空间构建用于内存管理的内存模型”,包括:
通过内存模型中大小固定的校验位,保存特定的magic num,用于在对内存操作时的校验。
4.根据权利要求3所述的一种内存管理库的实现方法,其特征在于:
当系统发生踩内存时,申请的两块内存间会发生重叠,通过标志位字段,判断出踩内存的发生。
5.根据权利要求2所述的一种内存管理库的实现方法,其特征在于,还包括,根据所述用内存管理块记录内存的引用情况,记录内存分配或释放的日志的步骤:
打开log开关,打印所述内存操作信息,排查内存情况;
打印队列中的内存信息。
6.根据权利要求2所述的一种内存管理库的实现方法,其特征在于,所述“根据所述用内存管理块记录内存的引用情况,释放所述内存”,包括:
根据内存指针计算所述内存管理模块的首地址;
增加内存引用计数,表征内存引用次数;
当内存引用计数的数值大于等于1则所述ptr的位置是所述内存管理模块的首地址,获取当前所述内存引用计数;同时记录memref,memunerf接口的调用情况。
7.根据权利要求6所述的一种内存管理库的实现方法,其特征在于,所述“根据所述用内存管理块记录内存的引用情况,并释放所述内存”,还包括:
当所述内存引用计数的值从1到2,将所述引用计数的值加1,而非重新申请内存;
当所述内存引用计数的值从2到1,将引用计数减1,而非释放内存。
8.根据权利要求1所述的一种内存管理库的实现方法,其特征在于,还包括:对所述内存块写入内容的步骤:
根据ptr计算内存管理块的首地址;
当,所述引用计数大于等于1且ptr已赋值内存管理块记录的内存块首地址且内存管理块记录的内存块大小大于等于要写入的内存的偏移量与要写入内容的内存大小之和时:
将要写的内容拷贝到内存块的首地址与偏移量中。
9.根据权利要求1所述的一种内存管理库的实现方法,其特征在于,还包括:对所述内存块读出内容的步骤:
根据ptr计算所述内存管理块的首地址;
当,所述引用计数大于等于1且ptr已赋值内存管理块记录的内存块首地址且内存管理块记录的内存块大小大于等于偏移量与要读的内容的大小之和时:
将首地址与偏移量的内容拷贝到读数据的内存。
10.一种内存管理库的内存模型,其特征在于,包括:
内存管理模块;
内存块,设置在所述内存管理模块的后侧,用于指代所述申请内存;
校验位,设置在所述内存块的后侧,用于对内存操作进行校验;
所述内存管理模块具有固定的大小,用于定义保存内存块的起始地址址、引用计数、内存块的大小、内存操作信息。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111604677.2A CN114489592A (zh) | 2021-12-24 | 2021-12-24 | 一种内存管理库的实现方法及内存模型 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111604677.2A CN114489592A (zh) | 2021-12-24 | 2021-12-24 | 一种内存管理库的实现方法及内存模型 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114489592A true CN114489592A (zh) | 2022-05-13 |
Family
ID=81495922
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111604677.2A Pending CN114489592A (zh) | 2021-12-24 | 2021-12-24 | 一种内存管理库的实现方法及内存模型 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114489592A (zh) |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109343953A (zh) * | 2018-08-29 | 2019-02-15 | 苏州科达科技股份有限公司 | 内存管理方法、装置及电子设备 |
CN109710530A (zh) * | 2018-12-28 | 2019-05-03 | 珠海西山居互动娱乐科技有限公司 | 一种检测对象的内存泄漏的方法及装置 |
CN111309289A (zh) * | 2019-11-19 | 2020-06-19 | 上海金融期货信息技术有限公司 | 一种内存池管理组件 |
-
2021
- 2021-12-24 CN CN202111604677.2A patent/CN114489592A/zh active Pending
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109343953A (zh) * | 2018-08-29 | 2019-02-15 | 苏州科达科技股份有限公司 | 内存管理方法、装置及电子设备 |
CN109710530A (zh) * | 2018-12-28 | 2019-05-03 | 珠海西山居互动娱乐科技有限公司 | 一种检测对象的内存泄漏的方法及装置 |
CN111309289A (zh) * | 2019-11-19 | 2020-06-19 | 上海金融期货信息技术有限公司 | 一种内存池管理组件 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110413521B (zh) | 一种堆内存的写越界检测方法和装置 | |
US6275857B1 (en) | System and method for freeing shared resources in a computer system | |
CN108763099A (zh) | 系统的启动方法、装置、电子设备和存储介质 | |
CN106919454B (zh) | 基于lte协议栈的内存池问题定位方法及其系统 | |
CN107133144B (zh) | 一种动态监测堆内存使用错误的内存监测装置及方法 | |
JP2008276763A (ja) | メモリエラーの検出法 | |
US7096339B2 (en) | System and method for detecting memory management programming errors | |
US8910004B2 (en) | Information processing apparatus, and method of controlling information processing apparatus | |
CN113987507A (zh) | 堆内存漏洞检测方法、装置、存储介质及电子设备 | |
US7617374B2 (en) | Hard disk testing method under extensible firmware interface | |
CN114489592A (zh) | 一种内存管理库的实现方法及内存模型 | |
CN110647764B (zh) | 针对用户态非易失性内存文件系统的保护方法及系统 | |
CN115328851A (zh) | 一种数据保护方法、装置、设备及介质 | |
US20230342282A1 (en) | Memory page markings as logging cues for processor-based execution tracing | |
US6463502B1 (en) | Backup copying of data to a tape unit with a cache memory | |
CN108038035A (zh) | 一种闪存读写状态的检测方法及相关装置 | |
CN114510394A (zh) | 服务器内存的分析方法、装置及计算机可读存储介质 | |
EP3721346B1 (en) | Bit-accurate-tracing analysis with applied memory region lifetimes | |
CN113485846A (zh) | 一种内存处理方法及装置 | |
CN117435385B (zh) | 一种日志记录方法、装置及电子设备和存储介质 | |
CN115016742B (zh) | 一种嵌入式设备的内存扩展方法 | |
JP2002055851A (ja) | コンピュータシステムにおける不正なメモリアクセスを検出する監視方法及びそのプログラム並びにその記録媒体 | |
US20040225925A1 (en) | Method for detecting computer memory access errors | |
CN115220970B (zh) | 一种定位内存泄漏方法、装置、计算机设备及存储介质 | |
CN117591327A (zh) | core文件生成方法、装置、电子设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20220513 |