您现在的位置是:主页 > news > 怎么做网站流量统计分析/互联网广告优势
怎么做网站流量统计分析/互联网广告优势
admin2025/5/4 14:50:12【news】
简介怎么做网站流量统计分析,互联网广告优势,做网站下载什么软件,电子商务专升本需要考些什么科目PAGEPAGE #C 语言多线程内存管理模块摘要:一个多线程动态内存管理模块,可以有效地检测C 语言中内存泄漏和内存越界等错误。1 原理分配通过重新改写内存分配函数, 把调用时的信息保存在一个节点中, 节点中包括此内存分 配的首地址&…
PAGE
PAGE #
C 语言多线程内存管理模块
摘要:
一个多线程动态内存管理模块,可以有效地检测C 语言中内存泄漏和内存越界等错
误。
1 原理
分配
通过重新改写内存分配函数, 把调用时的信息保存在一个节点中, 节点中包括此内存分 配的首地址,大小以及分配所在的源文件、函数、行号,并用一个 HASH 表来保存所有节 点。
越界检测 为了检测写越界的错误,在用户申请的内存前后各增加了一定大小的内存作为监测区 域,并初始化成预定值(Oxdeadbeef)。如果发生越界写操作时,预定值就会发生改变,即
可检测到越界操作错误。
释放
重新改写内存释放函数free,释放时节点从 HASH表中删除并进行越界检测。
查看
手动调用 show_memory()或show_memory_summary()查看内存使用情况并进行越界检 测。
以下涉及内存分配和内存释放的函数被重新改写:
malloc
calloc
realloc
strdup
strndup
asprintf
vasprintf
HASH 表如下图所示:
regions
U—
region
1
2
i
r egi on
regionl
3
4
5
regi on
6
7
9
LD
■
■
r € g.1 OIL
■
562
节点结构如下:static struct mm_regi on{structmm_regio n *n ext;
节点结构如下:
static struct mm_regi on
{
structmm_regio n *n ext;
char file[40];
char func[40];
unsigned int lineno; size_t len;
un sig ned intfen ce;
unsigned char data[0];
len长度的一块内存 */
} *regio ns[SOME_PRIME];
/*分配所在的函数*/
/*分配所在的行*/
/*内存分配的大小 */
/*内存起始边界,用于头越界检测*/
/*用户内存分配首地址,malloc等函数返回以此为首地址的
内存中一条节点的结构:
mm_regionnextfilefunclinenolendata内存结束边界 检测尾越界fenceOxdeadbeef内存起始边界 检测头越界fenceOxdeadbeef
mm_region
next
file
func
lineno
len
data
内存结束边界 检测尾越界
fence
Oxdeadbeef
内存起始边界 检测头越界
fenceOxdeadbeef
2测试
步骤:
引入头文件:在需要检测的C/C++文件中引入”mm.h”头文件;
查看内存使用情况:调用show_memory()函数查看本文件中内存泄漏详细情况,或调用
show_memory_summary()函数查看本文件中内存泄漏统计情况。
2.1
内存泄漏
2.1.1
测试代码
#in clude
/* 加入头文件 mm.h */
#i nclude"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;
}
2.1.2 测试结果
LEAK DETAIL:
6 bytes allocated inmain at line11 of nain.c
10 bytes allocated innain at line12 of
16 bytes allocated in 2 allocations
LEAK SUMMARY:
16 buites in 2 allocations in File ,恤
16 bytes allocated in 2 曰1丄口匚ction零
2.2内存越界
2.2.1测试代码
#i nclude
/* 加入头文件 mm.h */
#i nclude "mm.h"
int main( int argc, char *argv[]) {
char *mp = NULL;
mp = ( char *)malloc(6);
/*越界操作*/
memset(mp,0, 10);
/*释放或查看内存时检测*/
free(mp);
return 0;
}
222测试结果
WARNING: High Fenceal 0x87c70£8k i