您的位置:首页 > 编程语言 > C语言/C++

C++学习 boost学习之-intrusive_ptr

2015-05-27 14:22 309 查看
Boost中文手册下载:http://download.csdn.net/detail/skdkjxy/8723045

用法:

1 与share_ptr功能上是一样的,只不过引用计数是采用侵入式实现的,尽量避免使用,除非:

已有代码使用或提供了插入式的引用计数

智能指针的大小必须与裸指针的大小相等

需要把 this 当作智能指针来使用时(this是智能指针的this)

2  需要你提供两个函数 intrusive_ptr_add_ref 和intrusive_ptr_release. 它们都要接受一个参数,即指向你要使用intrusive_ptr的类型的指针,

intrusive_ptr内部会调用两个函数

实现这两个泛型函数的示范,但不是最终版本:
template <typename T> void intrusive_ptr_add_ref(T* t) {
t->add_ref();
}

template <typename T> void intrusive_ptr_release(T* t) {
if (t->release()<=0)
delete t;
}

3 把上面两个函数放在定义在它们操作的类型所在的名字空间里(T类型),同时增加有一些直接操作基类的函数,这样做的优点在于,即使从reference_counter派生的类定义在其它的名字空间,intrusive_ptr_add_ref 和intrusive_ptr_release 也还可以通过ADL (参数相关查找法)找到它们;ADL是一个查找规则,例如,调用一个函数,该函数在当前作用域空间中找不到,那么会到函数参数所在的命名空间中寻找;

下面是实现的一个例子:

class reference_counter {

    int ref_count_;

public:

    reference_counter() : ref_count_(0) {}

    virtual ~reference_counter() {}

    friend void intrusive_ptr_add_ref(reference_counter* p) {

        ++p->ref_count_;

    }

    friend void intrusive_ptr_release(reference_counter* p) {

        if (--p->ref_count_==0)

            delete p;

    }

    void add_ref() {

        ++ref_count_;

    }

    int release() {

        return --ref_count_;

    }

protected:

    reference_counter& operator=(const reference_counter&) {

        // 无操作

        return *this;

    }

private:

    // 禁止复制构造函数

    reference_counter(const reference_counter&);

};

class another_class : public reference_counter {

public:

    void call_before_destruction() const {

        std::cout <<

            "Yes, I'm ready before destruction\n";

    }

};

class derived_class : public another_class {};

template <typename T> void intrusive_ptr_add_ref(T* t) {

    t->add_ref();

}

template <typename T> void intrusive_ptr_release(T* t) {

    if (t->release()<=0) {

        delete t;

    }

}

int _tmain(int argc, _TCHAR* argv[])

{

    boost::intrusive_ptr< derived_class > share3(new derived_class());

    getchar();

    return 0;

}

综上,intrusive_ptr使用更加复杂,也意味着容易出错;由于旧的代码,或者是为了与第三方的类进行集成,不得不用;否则不用;程序设计的越简单越好;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: