C语言多线程内存管理模块DOCWord格式.docx

上传人:b****7 文档编号:22178644 上传时间:2023-02-02 格式:DOCX 页数:18 大小:71.90KB
下载 相关 举报
C语言多线程内存管理模块DOCWord格式.docx_第1页
第1页 / 共18页
C语言多线程内存管理模块DOCWord格式.docx_第2页
第2页 / 共18页
C语言多线程内存管理模块DOCWord格式.docx_第3页
第3页 / 共18页
C语言多线程内存管理模块DOCWord格式.docx_第4页
第4页 / 共18页
C语言多线程内存管理模块DOCWord格式.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

C语言多线程内存管理模块DOCWord格式.docx

《C语言多线程内存管理模块DOCWord格式.docx》由会员分享,可在线阅读,更多相关《C语言多线程内存管理模块DOCWord格式.docx(18页珍藏版)》请在冰豆网上搜索。

C语言多线程内存管理模块DOCWord格式.docx

size_tlen;

/*内存分配的大小*/

unsignedintfence;

/*内存起始边界,用于头越界检测*/

unsignedchardata[0];

/*用户内存分配首地址,malloc等函数返回以此为首地址的len长度的一块内存*/

}*regions[SOME_PRIME];

内存中一条节点的结构:

2测试

步骤:

1.引入头文件:

在需要检测的C/C++文件中引入”mm.h”头文件;

2.查看内存使用情况:

调用show_memory()函数查看本文件中内存泄漏详细情况,或调用show_memory_summary()函数查看本文件中内存泄漏统计情况。

2.1内存泄漏

2.1.1测试代码

#include<

stdio.h>

/*加入头文件mm.h*/

#include"

mm.h"

intmain(intargc,char*argv[])

char*mp=NULL;

char*cp=NULL;

mp=(char*)malloc(6);

cp=(char*)calloc(1,10);

/*查看内存泄漏*/

show_memory();

show_memory_summary();

return0;

}

2.1.2测试结果

2.2内存越界

2.2.1测试代码

/*越界操作*/

memset(mp,0,10);

/*释放或查看内存时检测*/

free(mp);

2.2.2测试结果

2.3释放错误

此类错误包括:

1.释放空指针

2.释放野指针

3.重复释放

4.内存释放的起始地址与内存分配的起始地址不一致

2.3.1测试代码

/*重复释放*/

2.3.2测试结果

3源码

两个文件:

”mm.h”和“mm.c”

3.1mm.h

/*

*mm.h

*

*memoryusagedebugging(fromAsterisk)

*/

#ifndef__MM_H__

#define__MM_H__

#ifdef__cplusplus

extern"

C"

{

#endif

/*Undefineanymacros*/

#undefmalloc

#undefcalloc

#undeffree

#undefrealloc

#undefstrdup

#undefstrndup

#undefasprintf

#undefvasprintf

void*__mm_calloc(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,intlineno,constchar*func);

void*__mm_realloc(void*ptr,size_tsize,constchar*file,intlineno,constchar*func);

char*__mm_strdup(constchar*s,constchar*file,intlineno,constchar*func);

char*__mm_strndup(constchar*s,size_tn,constchar*file,intlineno,constchar*func);

int__mm_asprintf(constchar*file,intlineno,constchar*func,char**strp,constchar*format,...);

int__mm_vasprintf(char**strp,constchar*format,va_listap,constchar*file,intlineno,constchar*func);

 

/*Provideourowndefinitions*/

#definecalloc(a,b)\

__mm_calloc(a,b,__FILE__,__LINE__,__PRETTY_FUNCTION__)

#definemalloc(a)\

__mm_malloc(a,__FILE__,__LINE__,__PRETTY_FUNCTION__)

#definefree(a)\

__mm_free(a,__FILE__,__LINE__,__PRETTY_FUNCTION__)

#definerealloc(a,b)\

__mm_realloc(a,b,__FILE__,__LINE__,__PRETTY_FUNCTION__)

#definestrdup(a)\

__mm_strdup(a,__FILE__,__LINE__,__PRETTY_FUNCTION__)

#definestrndup(a,b)\

__mm_strndup(a,b,__FILE__,__LINE__,__PRETTY_FUNCTION__)

#defineasprintf(a,b,c...)\

__mm_asprintf(__FILE__,__LINE__,__PRETTY_FUNCTION__,a,b,c)

#definevasprintf(a,b,c)\

__mm_vasprintf(a,b,c,__FILE__,__LINE__,__PRETTY_FUNCTION__)

intshow_memory(void);

intshow_memory_summary(void);

#endif/*__MM_H__*/

3.2mm.c

/*

*mm.c

*MemoryManagement(fromAsterisk)

pthread.h>

stdlib.h>

stdarg.h>

string.h>

/*本文中不使用自定义malloc,calloc,free等函数*/

#defineSOME_PRIME563

#defineFENCE_MAGIC0xdeadbeef

/*分配所在的文件*/

/*分配所在的函数*/

/*分配所在的行*/

/*内存分配的大小*/

/*内存起始边界,用于头越界检测*/

/*用户内存分配首地址,malloc等函数返回以此为首地址的len长度的一块内存*/

#defineHASH(a)\

(((unsignedlong)(a))%SOME_PRIME)

staticpthread_mutex_tmmlock=PTHREAD_MUTEX_INITIALIZER;

#definemm_log(...)\

do{\

fprintf(stderr,__VA_ARGS__);

\

}while(0)

staticinlinevoid*__mm_alloc_region(size_tsize,constchar*file,intlineno,constchar*func)

structmm_region*reg;

void*ptr=NULL;

unsignedint*fence;

inthash;

if(!

(reg=(structmm_region*)malloc(size+sizeof(*reg)+sizeof(*fence))))/*使用系统malloc*/

mm_log("

MemoryAllocationFailure-'

%d'

bytesinfunction%s"

"

atline%dof%s\n"

(int)size,func,lineno,file);

}

strncpy(reg->

file,file,sizeof(reg->

file));

func,func,sizeof(reg->

func));

reg->

lineno=lineno;

len=size;

ptr=reg->

data;

hash=HASH(ptr);

/*内存起始标志*/

fence=FENCE_MAGIC;

/*内存结束标志*/

fence=(unsignedint*)(ptr+reg->

len);

*fence=FENCE_MAGIC;

pthread_mutex_lock(&

mmlock);

next=regions[hash];

/*一个hash可能对应多个值*/

regions[hash]=reg;

pthread_mutex_unlock(&

returnptr;

staticinlinesize_t__mm_sizeof_region(void*ptr)

inthash=HASH(ptr);

size_tlen=0;

for(reg=regions[hash];

reg;

reg=reg->

next)

if(reg->

data==ptr)

{

len=reg->

len;

break;

}

returnlen;

staticvoid__mm_free_region(void*ptr,constchar*file,intlineno,constchar*func)

structmm_region*reg,*prev=NULL;

if(prev)

prev->

next=reg->

next;

else

regions[hash]=reg->

prev=reg;

if(reg)

{

/*头越界检测*/

fence!

=FENCE_MAGIC)

mm_log("

WARNING:

Headfenceviolationat%p,in%sof%s,"

"

line%d\n"

reg->

data,reg->

func,reg->

file,reg->

lineno);

/*尾越界检测*/

fence=(unsignedint*)(reg->

data+reg->

if(*fence!

Tailfenceviolationat%p,in%sof%s,"

free(reg);

}else

Freeingunusedmemoryat%p,in%sof%s,line%d\n"

ptr,func,file,lineno);

void*__mm_calloc(size_tnmemb,size_tsize,constchar*file,intlineno,constchar*func)

void*ptr;

if((ptr=__mm_alloc_region(size*nmemb,file,lineno,func)))

memset(ptr,0,size*nmemb);

void*__mm_malloc(size_tsize,constchar*file,intlineno,constchar*func)

return__mm_alloc_region(size,file,lineno,func);

void__mm_free(void*ptr,constchar*file,intlineno,constchar*func)

__mm_free_region(ptr,file,lineno,func);

void*__mm_realloc(void*ptr,size_tsize,constchar*file,intlineno,constchar*func)

void*tmp;

if(ptr&

&

!

(len=__mm_sizeof_region(ptr))){

Reallocofunallocedmemoryat%p,in%sof%s,"

ptr,func,file,lineno);

returnNULL;

(tmp=__mm_alloc_region(size,file,lineno,func)))

if(len>

size)

len=size;

if(ptr){

memcpy(tmp,ptr,len);

__mm_free_region(ptr,file,lineno,func);

returntmp;

char*__mm_strdup(constchar*s,constchar*file,intlineno,constchar*func)

s)

len=strlen(s)+1;

if((ptr=__mm_alloc_region(len,file,lineno,func)))

strcpy((char*)ptr,s);

return(char*)ptr;

char*__mm_strndup(constchar*s,size_tn,constchar*file,intlineno,constchar*func)

n)

len=n;

int__mm_asprintf(constchar*file,intlineno,constchar*func,char**strp,constchar*fmt,...)

intsize;

va_listap,ap2;

chars;

*strp=NULL;

va_start(ap,fmt);

va_copy(ap2,ap);

size=vsnprintf(&

s,1,fmt,ap2);

va_end(ap2);

(*strp=(char*)__mm_alloc_region(size+1,file,lineno,func)))

va_end(ap);

return-1;

vsnprintf(*strp,size+1,fmt,ap);

va_end(ap);

returnsize;

int__mm_vasprintf(char**strp,constchar*fmt,va_listap,constchar*file,intlineno,constchar*func)

va_listap2;

intshow_memory(void)

char*fn=NULL;

unsignedintx;

unsignedintlen=0;

unsignedintcount=0;

mm_log("

\nLEAKDETAIL:

\n"

);

for(x=0;

x<

SOME_PRIME;

x++)

for(reg=regions[x];

if(!

fn||!

strcasecmp(fn,reg->

file)||!

strcasecmp(fn,"

anomolies"

))

{

/*头越界检测*/

if(reg->

{

mm_log("

Headfenceviolationat%p,"

"

in%sof%s,line%d\n"

data,

reg->

}

/*尾越界检测*/

fence=(unsignedint*)(reg->

if(

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1