超级指针原理

一个资源必须在它被使用之前被申请,而在它使用之后不久被释放。

完美义者一般都设想以下理想情况:存在这样一些程序员,他们相信他们仅仅用手写代码就可以完成在任何时候需要释放内存时就释放该释放的内存,以及从来不会忘记用手写这些代码。这种设想往往会直接导致内存泄漏。好消息是:在有一些规则的制约之下,这种泄漏事故完全可以交由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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值