智能指针与引用计数
上一篇博客里,将内存池返回的索引包装成了一个指针类,以方便使用。这里介绍一下如何构造一个智能指针,以便更方便地使用。
智能指针使用引用计数进行内存管理。每个对象都记录自己被多少地方所引用。每当增加一个引用的位置时,这个数加1;引用减少时减1。当减到0时,说明没有地方使用这个对象,就将其删除。
引用计数有两种存放方式:一种是作为一个成员,存放于被引用的对象中;另一种是由指针对象管理,单独存放(比如放在堆空间)。这两种各自有优缺点:前者能够更容易地获得计数,并保证计数的唯一性,这在建立与其它语言的binding的时候比较方便。但是被引用物必须是一个含有计数成员的对象。后者对于被引用物的要求比较宽松,可以是非对象的基本类型。在boost库中,shared_ptr和intrusive_ptr就分别采用这两种设计。其中shared_ptr可以引用任何类型,但intrusive_ptr要求用户提供实现引用计数的函数(详见boost的intrusive_ptr文档)。
实现一个智能指针类
在这里,由于物理引擎的特性,我认为不需要计数基本类型,只需要计数那些被内存池管理的对象,而且将来可能建立脚本的binding(也许用Lua吧,API比较简单),因此将引用计数放在对象里。
首先,我们弄一个基类。所有能够使用我们智能指针的类都必须继承这个基类:
class Referenced { public: Referenced (): __refcnt(0) { } uint64_t __refcnt;