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

  1. 1、本文档共16页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C语言多线程内存管理模块

C语言多线程内存管理模块 摘要:一个多线程动态内存管理模块,可以有效地检测C语言中内存泄漏和内存越界等错误。 原理 分配 通过重新改写内存分配函数,把调用时的信息保存在一个节点中,节点中包括此内存分配的首地址,大小以及分配所在的源文件、函数、行号,并用一个HASH表来保存所有节点。 越界检测 为了检测写越界的错误,在用户申请的内存前后各增加了一定大小的内存作为监测区域,并初始化成预定值(0xdeadbeef)。如果发生越界写操作时,预定值就会发生改变, 即可检测到越界操作错误。 释放 重新改写内存释放函数free,释放时节点从HASH表中删除并进行越界检测。 查看 手动调用show_memory()或show_memory_summary()查看内存使用情况并进行越界检测。 以下涉及内存分配和内存释放的函数被重新改写: malloc calloc realloc strdup strndup asprintf vasprintf HASH表如下图所示: 节点结构如下: static struct mm_region { struct mm_region *next; char file[40]; /* 分配所在的文件 */ char func[40]; /* 分配所在的函数 */ unsigned int lineno; /* 分配所在的行 */ size_t len; /* 内存分配的大小 */ unsigned int fence; /* 内存起始边界,用于头越界检测 */ unsigned char data[0]; /* 用户内存分配首地址,malloc等函数返回以此为首地址的len长度的一块内存 */ } *regions[SOME_PRIME]; 内存中一条节点的结构: 测试 步骤: 引入头文件:在需要检测的C/C++文件中引入”mm.h”头文件; 查看内存使用情况:调用show_memory()函数查看本文件中内存泄漏详细情况,或调用show_memory_summary()函数查看本文件中内存泄漏统计情况。 内存泄漏 测试代码 #include <stdio.h> /* 加入头文件mm.h */ #include "mm.h" int main(int argc, char *argv[]) { char *mp = NULL; char *cp = NULL; mp = (char *)malloc(6); cp = (char *)calloc(1,10); /* 查看内存泄漏 */ show_memory(); show_memory_summary(); return 0; } 测试结果 内存越界 测试代码 #include <stdio.h> /* 加入头文件mm.h */ #include "mm.h" int main(int argc, char *argv[]) { char *mp = NULL; mp = (char *)malloc(6); /* 越界操作 */ memset(mp,0, 10); /* 释放或查看内存时检测 */ free(mp); return 0; } 测试结果 释放错误 此类错误包括: 释放空指针 释放野指针 重复释放 内存释放的起始地址与内存分配的起始地址不一致 测试代码 #include <stdio.h> /* 加入头文件mm.h */ #include "mm.h" int main(int argc, char *argv[]) { char *mp = NULL; mp = (char *)malloc(6); free(mp); /* 重复释放*/ free(mp); return 0; } 测试结果 源码 两个文件:”mm.h”和“mm.c” mm.h /* * mm.h * * memory usage debugging (from Asterisk) */ #ifndef __MM_H__ #define __MM_H__ #ifdef __cplusplus extern "C" { #endif /* Undefine any macros */ #undef malloc #undef calloc #undef free #undef realloc #undef strdup #undef strndup #undef asprintf #undef vasprintf void *__mm_calloc(size_t nm

您可能关注的文档

文档评论(0)

dashewan + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档