- 2. C++ 垃圾回收机制
C 语言本身没有垃圾回收机制,而C++ 0x则提供了基于引用计数算法的智能指针进行内存管理,也有一些不作为C++ 标准的垃圾回收库,如著名的Boehm库。借助其他的算法,也可以实现C/C++的GC机制,如标记—清除算法。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fEHgTLMq-1655295339787)(C:UsersSSMAppDataRoamingTyporatypora-user-images1655294125257.png)]
当应用程序使用malloc试图从堆上获取内存块时,通常都是以常规方式调用malloc,而当malloc找不到合适空闲块的时候,它就会去调用垃圾回收器,以回收垃圾到空闲链表。此时,垃圾收集器将识别出垃圾块,并通过free函数将其返回给堆。这样看来,垃圾收集器代替我们调用了free函数,从而让我们显式分配,而无需显式释放。
上图的垃圾收集器,是一个保守的垃圾收集器。保守的定义是:每个可达的块都能够正确的被标为可达,而一些不可达的块却可能被错误的标记为可达。
其根本原因在于C/C++语言不会用任何类型信息来标记存储器的位置,对于一个整形类型来说,语言本身没有一种显式的方法来判断它是一个整数还是一个指针。因此,如果某个整数值所代表的的地址,恰好是某个不可达块中某个字的地址,那么这个不可达块就会被标记为可达。
所以C/C++所实现的垃圾收集器都不是精确的,存在着回收不干净的现象。
而像Python的垃圾收集器则是精确回收。



