malloc是申请一块内存,free是释放一块内存!
说到内存,必然要说指针,指针指向某块内存嘛。
如:某函数内定义一个指针变量,并为其申请一块内存,让这个指针指向这块内存!此时,指针变量本身存在函数的栈区(调用函数时,创建栈区;调用结束时,栈区销毁)
而这块内存是存放在堆区的!这里有个错误的结论:函数调用结束时,在栈内的指针销毁的同时,它指向的内存也被销毁!它们是没有关系的,堆区内存的释放是由
free完成的!
同样,若是先用free释放指针指向的内存空间,这个指针也还是存在的!此时,这个指针所指的内存空间没有被编译器指定(即是无效的)!故,如果通过指针直接访问这块
内存会出错!
这里说下编译器的作用,程序在编译的时候,由编译器指定内存单元(虚拟内存单元),当程序加载到内存后才会分配内存单元(物理内存),由虚拟内存地址到
物理内存地址的转换是由pt表映射完成的。pt表是在什么时候创建的呢?当程序申请并获得PCB(进程控制块)后,会创建一个pt表(包括本程序中用到的所有变量是如何分配
空间的,以及变量的特性(由pt表项的标志位标识),如只读.....),程序的几个段区(stack,heap,bbs, readonly,data, text)都是在虚拟内存中划分的!
回到上个话题,如果有一块内存,编译器不知道,那么这块内存就是不可访问的!(正着说,编译器为程序中的变量指定内存单元,指定的内存都是用到的,没指定的自然也用
不到)。
所以当某个指针所指的内存单元被释放后,为防止这个指针在后面继续访问此处,可把指针置为NULL(由系统保证空指针不指向任何实际的对象或者函数。反过来说,任何对象或者函数的地址都不可能是空指针。)
(.........待续)