一个简单的智能指针






4.80/5 (5投票s)
2000年1月12日

123560

1766
基于模板的智能指针实现。
这里是另一个智能指针的实现。它尽可能简单。
如何使用
#include "/libs/idlsoft/smartptr.h" using namespace idllib; // in a body SmartPtr<CMyObject> ptr1(new CMyObject); // construct from a pointer SmartPtr<CMyObject> ptr2(ptr1); // construct from a smart pointer SmartPtr<CMyObject> ptr3; // construct an empty one ptr3 = new CMyObject; // assign a pointer ptr1 = ptr3; // assign a smart pointer ptr1->method1(); // call a method ptr2 = NULL; // etc ... // in a function call void f(CMyObject *ob); // function declaration ... SmartPtr<CMyObject> ptr1(new CMyObject); f(ptr1); // function call // as a return value SmartPtr<CMyObject> f1() { return SmartPtr<CMyObject>(new CMyObject); } ... SmartPtr<CMyObject> ptr; ptr = f1();
就是这样!
无需担心释放指针,对象将通过标准的引用计数机制被删除。
SmartPtr
是你真正需要的唯一类。它可以指向任何由 new
运算符分配的内存。
不恰当的使用方式
// 1. SmartPtr<CMyObject> ptr; CMyObject ob; ptr = &ob; // DON'T ! only memory allocated by new operator should be used // 2. SmartPtr<CMyObject> ptr1, ptr2; CMyObject *o2 = new CMyObject; ptr1 = o2; ptr2 = o2; // DON'T ! unless CMyObject implements IRefCount // try to use ptr1 = ptr2 instead, it's always safe;
它的实现方式
SmartPtr
持有一个指向引用计数对象的指针。每次我们将一个值赋给 SmartPtr
时,它都会减少当前对象的引用计数,并增加新对象的引用计数。引用计数器本身会在引用计数降至零时删除分配的对象。
引用计数器可以是分配对象的一部分(当我们实现 IRefCount
时),也可以是一个单独的对象(SmartPtr::__RefCounter
),它持有指向该对象的指针。
有关详细信息,请参见下一节。
如何优化内存使用
为了计算分配对象的引用次数,SmartPtr
会创建一个特殊对象,这意味着两次内存分配而不是一次。如果你想优化内存使用,只需在你的类中实现 IRefCount
。你可以自己实现,也可以使用 IRefCountImpl
class CMyObject : public CObject, public IRefCountImpl<CMyObject> { ... };在这种情况下,
SmartPtr
将使用内置计数器而不是单独的计数器。