c++ primer 5版,12章。讲到了 智能指针shared_ptr,并分析了它的“基本用法(没有提到循环引用的坑、this指针怎么share)和优点(避免一类野指针,程序异常catch是避免内存泄漏等)”。
shared_ptr是否真的可以解决c++里内存管理的很多难题呢?
如何用shared_ptr解决这些难题?
有没有其它方法解决这些难题?
这就是本文想要弄明白的主题。
1.
参考:
什么情况下 C++ 需要垃圾处理机制?
https://www.zhihu.com/question/308638046
这个链接里,很多人的观点不同,但都值得去理解和学习。
2.
c++11里shared_ptr的用法相关(循环引用的避免在大项目里难以保证----这个在《什么情况下 C++ 需要垃圾处理机制?》里,大家已经分析过了。但还是有用的。)
参考:
(1)
浅谈shared_ptr及shared_ptr涉及到的循环引用问题
https://blog.csdn.net/qq_34992845/article/details/69218843
这个链接,过多关注代码细节,反而不清晰。不过,例子不错。想看源码时,可以参考下。(我没看源码,不知道这个文章是否分析的有问题。)
(2)
shared_ptr循环引用&定置删除器
https://blog.51cto.com/11142019/1846847
这个链接,讲解比较简明.
(3)
解决:网上大部分是说用weak_ptr. (另外1种方式,显式删除,不太懂什么意思,没找到代码示例。也很少有人提到。)
3.
c++垃圾回收机制:
(1)
参考:
C++中垃圾回收机制中几种经典的垃圾回收算法
https://blog.csdn.net/u012611878/article/details/78947267
这个链接,讲述了垃圾回收的基本原理. 前置知识.
提到了最关键的 Mark & Sweep 算法
(2)
参考:
c 语言的 mark-sweep 实现
https://blog.csdn.net/yangzm/article/details/69525073
原文链接:
http://journal.stuffwithstuff.com/2013/12/08/babys-first-garbage-collector/
代码已经认真跑过一遍(200行左右)。相当好的东西。
清晰的说明了 垃圾回收的核心 Mark & Sweep 算法 实现细节。
(链表保存所有分配的内存,以备后续Sweep。当前栈里的元素递归前驱和回溯,Mark为“正在使用1”。按链表顺序Sweep并清理Mark为"无用0"的内存。)
对理解其它语言(例如Lua)里的“虚拟机”及其回收机制都有帮助。
另外,这个代码的作者,写了《游戏编程模式》。是个很优秀的同行。
(3)
参考:
https://zhuanlan.zhihu.com/p/266682616
这里提到了
非常广泛的一个C++垃圾回收器————BoehmGC
应该是一个生产环境可以使用的东西。(没试过,以后抽空了解下。)