第6课时《自定义智能指针》
2016-05-30 15:00
375 查看
一、智能指针 为了防止内存泄漏,而设计的一个管理类,主要是对资源引用的计数;其实就是一个引用计数器,当资源被使用时,计数器加1,释放时,计数器减1,当减至0时,内存释放不用。 我们看一下osg的超级指针osg::ref_ptr<T>Class Template Reference,其成员如下:
主要实现是通过上述表格中加粗加大的几个方法,来完成类模板的定义。其实主要还是通过以下两个方法来控制: int osg::Referenced::ref ( ) const int osg::Referenced::unref ( ) const 二、自定义超级指针 模仿osg的智能指针,我们定义如下模板类:sup_ptr<T>
ref_ptr () | |
ref_ptr (T *ptr) | |
ref_ptr (constref_ptr &rp) | |
template<class Other> | |
ref_ptr (constref_ptr< Other > &rp) | |
ref_ptr (observer_ptr< T > &optr) | |
~ref_ptr () | |
ref_ptr & | operator= (constref_ptr &rp) |
template<class Other> | |
ref_ptr & | operator= (constref_ptr< Other > &rp) |
ref_ptr & | operator= (T *ptr) |
bool | operator== (constref_ptr &rp) const |
bool | operator== (const T *ptr) const |
bool | operator!= (constref_ptr &rp) const |
bool | operator!= (const T *ptr) const |
bool | operator< (constref_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) |
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学习 第一章:基本对话框
- 使用Shiboken为C++和Qt库创建Python绑定
- 肯特·贝克:改变人生的代码整理魔法
- 你应该学习哪种编程语言?
- Qt 5.6更新至RC版,最终版本近在咫尺
- [转]我们需要一种其他人能使用的编程语言
- DB2编程序技巧(1)
- DB2编程序技巧 (四)
- 女人VS编程_国庆快乐
- DB2编程序技巧 (六)
- DB2编程序技巧 (三)
- DB2编程序技巧 (九)
- DB2编程序技巧 (七)
- DB2编程序小小技巧
- DB2编程序技巧 (五)
- DB2编程序技巧 (一)
- DB2编程序技巧 (八)
- DB2编程序技巧 (十)
- VBS基础编程教程 (第1篇)
- VBS基础编程教程 (第3篇)