C语言多线程内存管理模块.doc

C语言多线程内存管理模块.doc

ID:57394986

大小:100.50 KB

页数:16页

时间:2020-08-15

C语言多线程内存管理模块.doc_第1页
C语言多线程内存管理模块.doc_第2页
C语言多线程内存管理模块.doc_第3页
C语言多线程内存管理模块.doc_第4页
C语言多线程内存管理模块.doc_第5页
资源描述:

《C语言多线程内存管理模块.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、C语言多线程内存管理模块摘要:一个多线程动态内存管理模块,可以有效地检测C语言中内存泄漏和内存越界等错误。1原理l分配通过重新改写内存分配函数,把调用时的信息保存在一个节点中,节点中包括此内存分配的首地址,大小以及分配所在的源文件、函数、行号,并用一个HASH表来保存所有节点。l越界检测为了检测写越界的错误,在用户申请的内存前后各增加了一定大小的内存作为监测区域,并初始化成预定值(0xdeadbeef)。如果发生越界写操作时,预定值就会发生改变,即可检测到越界操作错误。l释放重新改写内存释放函数free,释放时节点

2、从HASH表中删除并进行越界检测。l查看手动调用show_memory()或show_memory_summary()查看内存使用情况并进行越界检测。以下涉及内存分配和内存释放的函数被重新改写:1.malloc2.calloc3.realloc4.strdup5.strndup6.asprintf7.vasprintfHASH表如下图所示:节点结构如下:staticstructmm_region{structmm_region*next;charfile[40];/*分配所在的文件*/charfunc[40];/*

3、分配所在的函数*/unsignedintlineno;/*分配所在的行*/size_tlen;/*内存分配的大小*/unsignedintfence;/*内存起始边界,用于头越界检测*/unsignedchardata[0];/*用户内存分配首地址,malloc等函数返回以此为首地址的len长度的一块内存*/}*regions[SOME_PRIME];内存中一条节点的结构:……nextfilefunclinenolenfence0xdeadbeefdatafence0xdeadbeef……mm_region内存起始

4、边界检测头越界内存结束边界检测尾越界1测试步骤:1.引入头文件:在需要检测的C/C++文件中引入”mm.h”头文件;2.查看内存使用情况:调用show_memory()函数查看本文件中内存泄漏详细情况,或调用show_memory_summary()函数查看本文件中内存泄漏统计情况。1.1内存泄漏1.1.1测试代码#include/*加入头文件mm.h*/#include"mm.h"intmain(intargc,char*argv[]){char*mp=NULL;char*cp=NULL;mp=

5、(char*)malloc(6);cp=(char*)calloc(1,10);/*查看内存泄漏*/show_memory();show_memory_summary();return0;}1.1.1测试结果1.2内存越界1.2.1测试代码#include/*加入头文件mm.h*/#include"mm.h"intmain(intargc,char*argv[]){char*mp=NULL;mp=(char*)malloc(6);/*越界操作*/memset(mp,0,10);/*释放或查看内存时

6、检测*/free(mp);return0;}1.1.1测试结果1.2释放错误此类错误包括:1.释放空指针2.释放野指针3.重复释放4.内存释放的起始地址与内存分配的起始地址不一致1.2.1测试代码#include/*加入头文件mm.h*/#include"mm.h"intmain(intargc,char*argv[]){char*mp=NULL;mp=(char*)malloc(6);free(mp);/*重复释放*/free(mp);return0;}1.2.2测试结果1源码两个文件:”mm.

7、h”和“mm.c”1.1mm.h/**mm.h**memoryusagedebugging(fromAsterisk)*/#ifndef__MM_H__#define__MM_H__#ifdef__cplusplusextern"C"{#endif/*Undefineanymacros*/#undefmalloc#undefcalloc#undeffree#undefrealloc#undefstrdup#undefstrndup#undefasprintf#undefvasprintfvoid*__mm_call

8、oc(size_tnmemb,size_tsize,constchar*file,intlineno,constchar*func);void*__mm_malloc(size_tsize,constchar*file,intlineno,constchar*func);void__mm_free(void*ptr,constchar*file,intlin

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。