第6课时《自定义智能指针》

8 篇文章 1 订阅

一、智能指针

        为了防止内存泄漏,而设计的一个管理类,主要是对资源引用的计数;其实就是一个引用计数器,当资源被使用时,计数器加1,释放时,计数器减1,当减至0时,内存释放不用。

       我们看一下osg的超级指针osg::ref_ptr<T>Class Template Reference,其成员如下:

 ref_ptr ()
 ref_ptr (T *ptr)
 ref_ptr (const ref_ptr &rp)
template<class Other>
 ref_ptr (const ref_ptr< Other > &rp)
 ref_ptr (observer_ptr< T > &optr)
 ~ref_ptr ()
ref_ptroperator= (const ref_ptr &rp)
template<class Other>
ref_ptroperator= (const ref_ptr< Other > &rp)
ref_ptroperator= (T *ptr)
bool operator== (const ref_ptr &rp) const
bool operator== (const T *ptr) const
bool operator!= (const ref_ptr &rp) const
bool operator!= (const T *ptr) const
bool operator< (const ref_ptr &rp) const
 operator unspecified_bool_type () const
T & operator* () const
T * operator-> () const
T * get () const
bool operator! () const
bool valid () const
T * release ()
void swap (ref_ptr &rp)
   主要实现是通过上述表格中加粗加大的几个方法,来完成类模板的定义。其实主要还是通过以下两个方法来控制:

   int osg::Referenced::ref  (   )  const 

   int osg::Referenced::unref  (   )  const 
   

二、自定义超级指针

     模仿osg的智能指针,我们定义如下模板类:sup_ptr<T>

template <class T>
class sup_ptr{
public:
    sup_ptr(){
        _ptr=NULL;
    }
    sup_ptr(T *ptr){
        _ptr=ptr;
        if(_ptr)
        {
            _ptr->ref();//引用计数加1
        }
    }
    ~sup_ptr()
    {
        if(_ptr)
        {
            _ptr->unref();//引用计数减1
        }
    }
    //重载运算符=
    sup_ptr& operator= (T *p)
    {
        T *temp = _ptr;
        _ptr = p;
        if(_ptr)
        {
            _ptr->ref();
        }
        if(temp)
        {
            temp->unref();
        }
        return *this;
    }
    //重载运算符*
    T& operator*()
    {
        return *_ptr;
    }
    //重载运算符()
    operator T* () const
    {
        return _ptr;
    }
    //重载运算符->
    T *  operator-> () const
    {
        return _ptr;
    }
    //重载get方法
    T *  get ()  {
        return _ptr;
    }
 
private:
    T *_ptr;
};

三、使用自定义超级指针

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    osgQt::initQtWindowingSystem();
    sup_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
    sup_ptr<osg::Group> root= new osg::Group;
    root->addChild(osgDB::readNodeFile("glider.osg"));
    root->addChild(osgDB::readNodeFile("osgcool.osgt"));
    viewer->setSceneData(root);
 
 
 
    viewer->setCameraManipulator(new osgGA::TrackballManipulator);
    viewer->addEventHandler(new osgViewer::StatsHandler);
    osgQt::GLWidget * glw= new osgQt::GLWidget;
    osgQt::GraphicsWindowQt * graphic= new osgQt::GraphicsWindowQt(glw);
    osgQt::setViewer(viewer);
    viewer->getCamera()->setGraphicsContext(graphic);
    viewer->getCamera()->setViewport(new osg::Viewport(0,0,glw->width(),glw->height()));
    glw->show();
    return a.exec();
}
四、运行效果如下:


       

       

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值