65.9K
CodeProject 正在变化。 阅读更多。
Home

一个简单的智能指针

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.80/5 (5投票s)

2000年1月12日

viewsIcon

123560

downloadIcon

1766

基于模板的智能指针实现。

  • 下载演示项目 - 19 Kb
  • 下载源代码文件 - 1.6 Kb
  • 这里是另一个智能指针的实现。它尽可能简单。

    如何使用

    #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 将使用内置计数器而不是单独的计数器。
    © . All rights reserved.