C语言开发中的内存检测基本模块

1、前言

在用C语言开发产品时,因为C语言中的指针操做的灵活性,所以在使用指针时也须要特别当心,稍微不严谨就会致使内存问题,如内存未初始化,内存泄露,内存重复释放等。iphone

可是在实际开发中,使用指针是不可避免的,那么出现内存问题也是不可避免的,由于不可能每一个人都会仔细的敲代码并审查代码;那么若是出现这些问题时,有什么弥补手段了?函数

这时候在项目开发中,使用内存检测模块就很是有必要了。post

2、基本原理

要使用一块新内存,要么从栈上分配,要么从堆上分配,若是是从堆上分配,那么就记录申请好的内存起始地址,分配的大小,文件名和行号(哪一个文件的哪一行调用了分配函数),学习

若是是释放堆上的内存,一样记录释放的地址,文件名和行号(哪一个文件的哪一行调用了释放函数),这样对全部的分配和释放操做进行记录的话,就能够解决一些内存操做问题,指针

如内存泄露,内存重复释放等;大致结构以下图所示:商帐追收code

3、应用开发

C语言中的内存申请函数为malloc,内存释放函数为free,若是咱们在产品开发中直接使用这两个函数,那么又怎么会获得文件名和行号了?所以须要对malloc和free函数进行封装,blog

使用宏进行封装,如ip

#define DAWEN_MALLOC(_size) my_malloc(_size,__FILE__,__LINE__) 内存

#define DAWEN_FREE(_pointer) my_free(_pointer,__FILE__,__LINE__)开发

其中__FILE__,__LINE__宏为系统自定义的宏,表示当前代码运行处的文件名和行号,而后,在my_malloc函数中使用malloc系统函数,在my_free函数中使用free系统

函数,这样就能够记录一些信息了。因此在开发时,一概使用my_malloc来申请内存,使用my_free来释放内存。

4、内存操做注意事项

我在这里写了C语言开发中的指针操做注意释放,但愿与你们一块儿学习:

一、申请一段内存后,应对该内存内存进行初始化,如调用memset进行清零操做

二、申请内存后,在进行操做以前,应对申请后的指针进行空值判断

三、释放指针后,该指针必须赋值为NULL,固然赋值操做这个操做在my_free函数中进行,因此my_free函数的参数为二级指针

四、尽可能坚持谁申请谁释放的规则,若是不是,则组成员应该协商或者代码加注释说明iphone5

5、备注

关于内存覆盖和内存访问越界,一直找不到好的方法检测。。郁闷中。。。。。

相关文章
相关标签/搜索