在用C语言开发产品时,因为C语言中的指针操做的灵活性,所以在使用指针时也须要特别当心,稍微不严谨就会致使内存问题,如内存未初始化,内存泄露,内存重复释放等。iphone
可是在实际开发中,使用指针是不可避免的,那么出现内存问题也是不可避免的,由于不可能每一个人都会仔细的敲代码并审查代码;那么若是出现这些问题时,有什么弥补手段了?函数
这时候在项目开发中,使用内存检测模块就很是有必要了。post
要使用一块新内存,要么从栈上分配,要么从堆上分配,若是是从堆上分配,那么就记录申请好的内存起始地址,分配的大小,文件名和行号(哪一个文件的哪一行调用了分配函数),学习
若是是释放堆上的内存,一样记录释放的地址,文件名和行号(哪一个文件的哪一行调用了释放函数),这样对全部的分配和释放操做进行记录的话,就能够解决一些内存操做问题,指针
如内存泄露,内存重复释放等;大致结构以下图所示:商帐追收code
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来释放内存。
我在这里写了C语言开发中的指针操做注意释放,但愿与你们一块儿学习:
一、申请一段内存后,应对该内存内存进行初始化,如调用memset进行清零操做
二、申请内存后,在进行操做以前,应对申请后的指针进行空值判断
三、释放指针后,该指针必须赋值为NULL,固然赋值操做这个操做在my_free函数中进行,因此my_free函数的参数为二级指针
四、尽可能坚持谁申请谁释放的规则,若是不是,则组成员应该协商或者代码加注释说明iphone5
关于内存覆盖和内存访问越界,一直找不到好的方法检测。。郁闷中。。。。。