C++学习 boost学习之-intrusive_ptr

Boost中文手册下载:http://download.csdn.net/detail/skdkjxy/8723045

用法:

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

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

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

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

2  需要你提供两个函数 intrusive_ptr_add_refintrusive_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_refintrusive_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使用更加复杂,也意味着容易出错;由于旧的代码,或者是为了与第三方的类进行集成,不得不用;否则不用;程序设计的越简单越好;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值