第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();
}
四、运行效果如下:


       

       


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

Qt 中的智能指针

Qt 中的智能指针上一篇博客中介绍了 C++11 标准中的提供的智能指针。在 Qt 中也提供了类似的替代功能,并且比 C++11 标准中提供的功能还要强大,所以如果我们使用 Qt 作为基础库,那么就没...
  • liyuanbhu
  • liyuanbhu
  • 2017年09月03日 21:19
  • 805

Python 小甲鱼教程 课后练习33 异常处理

第一题: 要求如下,检测输入是否为整数,如果是整数的话,通过,不是的话,捕获错误并报错! 代码如下: def int_input(prompt=''):     whi...
  • bestallen
  • bestallen
  • 2016年07月17日 16:17
  • 708

自定义智能指针

1).自定义的智能指针shared_ptr;
  • zzyafyj
  • zzyafyj
  • 2014年08月25日 12:08
  • 430

第35课第五题拓展

#include #include //第五题, 现在北京有一套房子,价格200万,假设房价每年上涨10%,一个软件工程师每年固定能赚40万。如果他想买这套房子,不贷款,不涨工资,没有其 //他收...
  • fh73566021
  • fh73566021
  • 2015年05月05日 20:28
  • 217

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

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

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

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

零基础入门学习Python(3)--小插曲之变量和字符串

前言 小甲鱼说,在对前边的小游戏改善前,先了解下,Python中的变量与字符串。 主要内容 变量 变量名就像我们现实社会的名字,把一个值赋值给一个名字时,Ta会存储在内存中,称之为变量(...
  • wanbin6470398
  • wanbin6470398
  • 2018年01月31日 11:04
  • 18

Introduction to C++ Programming in UE4

所在原文目录结构位置: C++ Programming Guide  |_____Programming Quick Start Guide  |_____Introduction to C++ Pr...
  • lunweiwangxi3
  • lunweiwangxi3
  • 2015年06月25日 11:17
  • 1261

初学者--bootstrap(四)栅格系统----在路上(8)

栅格系统:是bootstrap提供的响应式布局方式 栅格系统的核心:就是把容器container划分12等分,也就是版心被划分12等份。 栅格系统大多引用的是bootstrap的插件,所以代码写起来会...
  • qq_36995398
  • qq_36995398
  • 2016年12月12日 20:10
  • 354

第6课时:python之常用操作符

+,-,*,/(除法),//(除法取商),**(幂运算) 10/8=1.25 10//8=1 双目操作符比左边的优先级高比右边操作符低 and,or,not >>> -3**2 -9 ...
  • mayanyun2013
  • mayanyun2013
  • 2016年01月14日 13:45
  • 176
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:第6课时《自定义智能指针》
举报原因:
原因补充:

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