C语言内存管理和垃圾回收策略
C语言程序的内存划分
一个可执行的C语言程序,在执行的时候,其内存主要分为四个部分。
链接:五个部分
代码段:存放程序代码的二进制
静态区:存放静态变量和静态变量
栈:存放局部变量
堆:存放动态申请的资源
也有说五个段的,都差不多。只不过细分了。
链接:五个部分
代码段:存放执行代码
数据段:存放已初始化的全局变量和静态变量。
BBS段:存放未初始化的全局变量和静态变量。
栈:存放程序临时创建的局部变量
堆:存放进程运行中被动态分配的内存段
垃圾回收策略
上述除了堆中的内存外,其他的内存在程序的运行过程,都会被程序自动回收或者在结束后由系统自动回收。
堆的动态申请的资源,在使用结束后需要程序员一一去free。C语言本身对于程序运行中动态申请的内存,没有自动释放的机制。
也许对于大型的C语言写的系统(软件,程序),可以采用一些比较合适的垃圾回收策略,对动态申请内存的函数进行包装,使申请的内存能够自动进行释放。
垃圾回收策略有很多,引用计数、标记清除算法、复制算法、标记整理算法、增量收集算法、分代收集算法等。
比较常用的有引用计数法和标记清楚法。
引用计数法的例子,可以看看C语言的Json库,对于Json对象的申请和释放就是采用的引用计数法进行自动管理的。
标记清除法的例子,可以看看JavaScripe,这个脚本语言采用了标记清楚法管理内存。