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

原创 2016年05月30日 15:00:16

一、智能指针

        为了防止内存泄漏,而设计的一个管理类,主要是对资源引用的计数;其实就是一个引用计数器,当资源被使用时,计数器加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_ptr operator= (const ref_ptr &rp)
template<class Other>
ref_ptr operator= (const ref_ptr< Other > &rp)
ref_ptr operator= (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();
}
四、运行效果如下:


       

       


版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

C/C++知识要点5——智能指针原理及自定义实现

智能指针概述: 智能指针用来管理动态对象。其行为类似于常规指针,重要的区别是:它负责自动释放所指向的对象。 C++ 11标准库提供两种智能指针:shared_ptr、unique_ptr 区别是...

实战c++中的智能指针unique_ptr系列-- unique_ptr的get_deleter方法(自定义删除器)

unique_ptr的成员函数在上一篇博客中几乎全部涵盖,其实还有一个很有踢掉,即std::unique_ptr::get_deleter字面已经很明显了,就获得deleter: Returns t...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

C/C++知识要点5——智能指针原理及自定义实现

智能指针概述: 智能指针用来管理动态对象。其行为类似于常规指针,重要的区别是:它负责自动释放所指向的对象。 C++ 11标准库提供两种智能指针:shared_ptr、unique_ptr 区别是...

C++ - 智能指针(smarter pointer)自定义删除器(deleter) 的方法 详解 及 代码

智能指针(smarter pointer)自定义删除器(deleter) 的方法 详解 及 代码   版权所有, 禁止转载, 如有需要, 请站内联系 本文地址: http://blog.csdn.ne...

自定义智能指针

1).自定义的智能指针shared_ptr;
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)