一个资源必须在它被使用之前被申请,而在它使用之后不久被释放。
完美义者一般都设想以下理想情况:存在这样一些程序员,他们相信他们仅仅用手写代码就可以完成在任何时候需要释放内存时就释放该释放的内存,以及从来不会忘记用手写这些代码。这种设想往往会直接导致内存泄漏。好消息是:在有一些规则的制约之下,这种泄漏事故完全可以交由C++编译器去检查处理,这种做法往往比我们肆意妄为要可靠的多。
#include <iostream>
#include "../Common/Common.h"
#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
class Real
{
public:
Real()
{
count = 0;
std::cout<<" Real has created"<<std::endl;
}
~Real()
{
std::cout<<" Real has destroyed"<<std::endl;
}
void ref()
{
count ++;
}
void unref()
{
count --;
if (!count)
{
delete(this);
}
}
private:
int count;
};
//申请一个类来管理Real类的指针
template <class T>
class ref_pter
{
public:
ref_pter()
{
_ptr = NULL;
}
ref_pter(T *ptr)
{
_ptr = ptr;
if (_ptr)
{
_ptr->ref();
}
}
~ref_pter()
{
if (_ptr)
{
_ptr->unref();
}
}
ref_pter& operator= (Real *pa)
{
T *temp = _ptr;
_ptr = pa;
if (_ptr)
{
_ptr->ref();
}
if (temp)
{
temp->unref();
}
return *this;
}
T* get()
{
return _ptr;
}
//重载()运算符
operator T* () const
{
return _ptr;
}
T* operator ->()
{
return _ptr;
}
private:
T *_ptr;
};
void foo(Real *a)
{
}
void main()
{
ref_pter<osgViewer::Viewer> viewer = new osgViewer::Viewer;
viewer->setSceneData(osgDB::readNodeFile("glider.osg"));
//ref_pter<Real> rp = new Real;
//foo(rp);
//std::cout<<" main is running"<<std::endl;
viewer->run();
}
基本的思想:将一个计数器与类指向的对象相关联。使用计数跟踪该类有多少个对象共享同一指针。使用计数为0时,删除对象。
这里写了一个简单的类ref_pter来管理Real类的指针。然后用它管理osg的 viewer类 ,实验一下。
原文链接: https://www.cnblogs.com/hyfemma/archive/2011/03/27/1997189.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/22928
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!