对象生命周期是个很大的课题 ,本文仅是♂科普贴,介绍了对象生命周期管理的概念,原理,方法,并给出相关链接。
对象
在程序事务中,涉及使用各种资源(内存,IO句柄,GDI等),在面向对象方法学里,我们将资源包装成对象,对象的 构造/销毁,对应资源的申请/释放。
生命周期
我们不能一直创建对象(资源泄露),也不能在资源销毁后,继续访问(野指针效句柄),我们需要在合适的时机释放合适的对象。
对象生命周期管理分三类,
- 手动管理
- 半自动管理 —— 编译器检查,通过库实现的智能指针等
- 全自动管理 —— GC
一些例子:
垃圾回收
垃圾回收来自于这样的想法,程序员不应该关心对象如何回收,运行时自己去解决。
原理: 已创建对象 - 环境栈上的对象 - 所有可到达对象 == 垃圾对象
标记-清除 算法:
- 所有对象初始标记 不可回收
- 资源使用到达阈值-> 翻转不可回收标记为可回收标记,
- 栈对象加入可访问对象集,
- 个可访问对象的引用成员,加入可访问对象集,并标记不可回收,递归至所有可访问对象上色,
- 遍历全部对象,回收所有未染色对象
实际的垃圾回收算法极其复杂,至今,没有一个完美的并发算法,使得在GC时,系统不暂停(stop the world)
其它
通常 对象需要提供,无参的 构造函数,init(...), reset()规范,对象池通过栈实现.
template<typename OBJECT> class object_pool { OBJECT* create_object(...) { auto object = pool.pop() object.init(...) ... } void release_object(OBJECT object) { object.reset() pool.push(object) } ... }