指针和内存泄漏(p=NULL
和free(p)
)
C语言
真是既简单又深奥,还挺意思;今天小伙伴又有什么问题呢?!
一、题目
为什么在代码里,一个
node
指针在malloc
一段内存后,需要首先memset
一下,并且free
掉之后,还可以通过node
指针访问到里面的内容?
二、分析
下面按照关键点来逐条分析:
-
为什么要
memset
一下:
其实程序新申请的内存空间中,并不能保证空间是零值。比如另一个程序刚刚释放了此空间,正好此时系统被分配了此空间,如果直接读取的话,肯定就能读到之前程序写入的数据,这样就有可能对我们的数据造成污染,所以需要memset
来全部置零,保证自己程序数据的安全。
不仅是内存,在磁盘上也是,在我们删除电脑文件的时候,一个大文件一下就删除掉了,其实系统并没有删除掉磁盘的数据,只是告诉系统这一段磁盘空间被释放了,别的程序可以往这一段空间写数据了,原来文件数据都还存在磁盘里,文件恢复工具就是利用这个原理来恢复旧文件(在没有别的程序写数据的情况下,轻松就恢复了这个文件)。 -
为什么
free
掉之后,还可以通过指针访问到?
其实这和上面memset
是同理的,free
指针之后,只是告诉系统该空间可以被别的程序使用,而并没有抹掉此空间里的数据。所以只要在别的程序写入数据之前访问,还是可以读取到原来的数据的。 -
在日常开发中该怎么办?
在日常开发中,当然是养成良好的习惯!
由于free
会释放内存,p=NULL
会释放指针的指向地址;所以他们两个要成对出现;首先free
内存,然后把指针指向NULL
。(如果先指向NULL
就会造成内存泄漏,切记!)
三、总结
养成良好的编程习惯,搞明白一条语句到底干了什么! 必然会帮你走的更远!
——2020-04-04——