C++智能指针 intrusive_ptr

本文介绍了C++中boost::intrusive_ptr的使用,这是一种侵入式的引用计数指针,需要对象自身实现引用计数功能。通过实例展示了如何实现intrusive_ptr_base基类以及intrusive_ptr_add_ref和intrusive_ptr_release接口。同时对比了boost::shared_ptr,指出shared_ptr的非侵入性及避免多次创建导致的对象销毁陷阱,并探讨了为何通常推荐使用shared_ptr而非intrusive_ptr。
摘要由CSDN通过智能技术生成
intrusive_ptr:
intrusive_ptr是一个侵入式的引用计数型指针,它可以用于以下两种情形:
【1】对内存占用的要求非常严格,要求必须与原始指针一样;

【2】现存代码已经有了引用计数机制管理的对象

boost::intrusive_ptr一种“侵入式”的引用计数指针,它实际并不提供引用计数功能,而是要求被存储的对象自己实现引用计数功能,并提供intrusive_ptr_add_refintrusive_ptr_release函数接口供boost::intrusive_ptr调用。

下面通过一个具体的例子来说明boost::intrusive_ptr的用法,首先实现一个基类intrusive_ptr_base,定义intrusive_ptr_add_ref和intrusive_ptr_release函数来提供引用计数功能。


/**

* intrusive_ptr_base基类,提供intrusive_ptr_add_ref()和intrusive_ptr_release()函数来提供引用计数功能;

* 使用boost::intrusive_ptr指针存储的用户类类型必须继承自intrusive_ptr_base基类。

*/

#include <ostream>

#include <boost/checked_delete.hpp>

#include <boost/detail/atomic_count.hpp>

template<class T>

class intrusive_ptr_base {

public:

    /**

    * 缺省构造函数

    */

    intrusive_ptr_base(): ref_count(0) {

        std::cout << "  Default constructor " << std::endl;

    }

     

    /**

    * 不允许拷贝构造,只能使用intrusive_ptr来构造另一个intrusive_ptr

    */

    intrusive_ptr_base(intrusive_ptr_base<T> const&): ref_count(0) {

        std::cout << "  Copy constructor..." << std::endl;

    }
 

    /**

    * 不允许进行赋值操作

    */

    intrusive_ptr_base& operator=(intrusive_ptr_base const& rhs) {

        std::cout << "  Assignment operator..." << std::endl;

        return *this;

    }

     

    /**

    * 递增引用计数(放到基类中以便compiler能找到,否则需要放到boost名字空间中)

    */

    friend void intrusive_ptr_add_ref(intrusive_ptr_base<T> const* s) {

        std::cout << "  intrusive_ptr_add_ref..." << std::endl;

        assert(s->ref_count >= 0);

        assert(s != 0);

        ++s->ref_count;

    }

 

    /**

    * 递减引用计数

    */

    friend void intrusive_ptr_release(intrusive_ptr_base<T> const* s) {

        std::cout << "  intrusive_ptr_release..." << std::endl;

        assert(s->ref_count > 0);

        assert(s != 0);

        if (--s->ref_count == 0)

            boost::checked_delete(static_cast<T const*>(s));  //s的实际类型就是T,intrusive_ptr_base<T>为基类

    }

     

    /**

    * 类似于shared_from_this()函数

    */

    boost::intrusive_ptr<T> self() {

        return boost::intrusive_ptr<T>((T*)this);

    }

    boost::intrusive_ptr<const T> self() const {

        return boost::intrusive_ptr<const T>((T const*)this);

    }

    int refcount() const {

        return ref_count;

    }

     

private:

    ///should be modifiable even from const intrusive_ptr objects

    mutable boost::detail::atomic_count ref_count;

 

}; 


用户类类型需要继承intrusive_ptr_base基类,以便具有引用计数功能。

#include <iostream>

#include <string>

#include <boost/intrusive_ptr.hpp>

#include "intrusive_ptr_base.hpp"

 

/**

* 用户类类型继承自intrusive_ptr_base,该实现方式类似于b
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值