文档章节

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

墙头草
 墙头草
发布于 2011/05/26 10:07
字数 753
阅读 142
收藏 2

一、前言

在用C语言开发产品时,由于C语言中的指针操作的灵活性,因此在使用指针时也需要特别小心,稍微不严谨就会导致内存问题,如内存未初始化,内存泄露,内存重复释放等。

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

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

二、基本原理

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

如果是释放堆上的内存,同样记录释放的地址,文件名和行号(哪个文件的哪一行调用了释放函数),这样对所有的分配和释放操作进行记录的话,就可以解决一些内存操作问题,

如内存泄露,内存重复释放等;大体结构如下图所示:商账追收

三、应用开发

C语言中的内存申请函数为malloc,内存释放函数为free,如果我们在产品开发中直接使用这两个函数,那么又怎么会得到文件名和行号了?因此需要对malloc和free函数进行封装,

使用宏进行封装,如

#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语言开发中的指针操作注意释放,希望与大家一起学习:

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

2、申请内存后,在进行操作之前,应对申请后的指针进行空值判断

3、释放指针后,该指针必须赋值为NULL,当然赋值操作这个操作在my_free函数中进行,所以my_free函数的参数为二级指针

4、尽量坚持谁申请谁释放的规则,如果不是,则组成员应该协商或者代码加注释说明iphone5

五、备注

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

© 著作权归作者所有

共有 人打赏支持
墙头草
粉丝 16
博文 145
码字总数 117172
作品 0
卢湾
私信 提问
哈 ,喷下 static 我的个人观点

@乌龟壳 我专门喷个水帖,讨论下static吧。算个人片面观点,抛砖引玉,欢迎大家指正。 static ,基本的三个用法,针对数据(我的个人习惯用语,可等同为C语言教科书上的变量),有 函数内的,...

中山野鬼
2016/12/22
717
8
写给Python程序员:如何利用Rust取代C/C++?

  【IT168 评论】Rust是Mozilla开发的注重性能和内存安全的语言,它的设计目的是逐渐取代C/C ++,但这个过程还需要一段时间。   值得肯定的是,Rust在现有阶段可以取代传统上部分C语言库...

it168网站
2017/07/28
0
0
sRDI:一款通过Shellcode实现反射型DLL注入的强大工具

  今天给大家介绍的是一款名叫sRDI的注入工具,它可以基于Shellcode实现反射型DLL注入,并能够将DLL转换成独立的Shellcode。       工具介绍   sRDI的所有功能基于以下两个组件:  ...

FreeBuf
2018/08/25
0
0
JNI学习笔记之ndk-build手动编译并集成流程

参考 一天掌握Android JNI本地编程 快速入门 Android开发实践:常用NDK命令行参数 Secrets of Android.mk JNI JNI是啥? JNI(Java Native Interface):Java本地开发接口,JNI是一个协议,用来...

newtrek
2017/11/05
0
0
C语言嵌入式系统编程修炼之背景篇

这是我13年前创作和发表在互联网上的文章,这么多年过去了,这篇文章仍然在到处传播。现在贴回Linuxer公众号。 全文目录: C语言嵌入式系统编程修炼之道——背景篇 C语言嵌入式系统编程修炼之...

jus3ve
2017/12/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

带你看数据挖掘与机器学习-厦大EDP上课出勤预测

带你看数据挖掘与机器学习-厦大EDP上课出勤预测 标签: 数据挖掘 特征工程 机器学习 出勤预测 write by xmhexi 2019/3/22 内容提要 首先说明本文是一篇科普文章,通过一个实际案例,帮助理解什...

xmhexi
今天
43
0
IOS  学习记录

1.StackView=>IOS 9及以上支持 2.布局方式: AutoLayout / StackView 堆布局 (线性布局) 3.屏幕适配 (资源分辨率、设计分辨率、屏幕分辨率) Size Class技术 可以针对 屏幕的方向进行设置...

萨x姆
今天
4
0
第四次工业革命:自主经济的崛起

https://36kr.com/p/5170370.html

shengjuntu
昨天
3
0
Cloud Native 与12-Factor

12-Factor(twelve-factor),也称为“十二要素”,是一套流行的应用程序开发原则。Cloud Native架构中使用12-Factor作为设计准则。 12-Factor 的目标在于: 使用标准化流程自动配置,从而使...

waylau
昨天
10
0
java多线程2

“非线程安全”问题存在于“实例变量”中,如果是方法内部的私有变量,则不存在线程安全问题。这是因为方法内部的变量都是私有造成的。 synchronized 获取的都是对象锁。如果多个线程访问多个...

一滴水穿石
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部