文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>一个简单的智能指针

一个简单的智能指针

时间:2010-12-23  来源:秩名

  01// helloworld.cpp : 定义控制台应用程序的入口点。

  02//

  03

  04#include "stdafx.h"

  05#include<iostream>

  06using namespace std;

  07

  08//指针类

  09class I_Pointer{

  10private:

  11 int ref_count;

  12 int *p;

  13 I_Pointer(int *p): p(p), ref_count(1){}; //构造函数

  14 ~I_Pointer(){

  15 cout<<"Delete shared pointer"<<endl;

  16 }

  17friend

  18 class Has_Ptr;

  19};

  20

  21//有指针成员的类

  22class Has_Ptr{

  23private:

  24 I_Pointer *ptr; //指针成员

  25 //减少引用计数

  26 void release_ref_count(){

  27 cout<<"release reference count"<<endl;

  28 if(--(ptr->ref_count) == 1){

  29 free_and_nil();

  30 }

  31 }

  32 //增加引用计数

  33 void add_ref(){

  34 cout<<"add reference count"<<endl;

  35 ++(ptr->ref_count);

  36 }

  37 //指针释放

  38 void free_and_nil(){

  39 delete ptr;

  40 ptr = NULL;

  41 }

  42

  43public:

  44 // 带int指针的构造函数

  45 Has_Ptr(int *ptr): ptr(new I_Pointer(ptr)) {

  46 add_ref();

  47 }

  48

  49 Has_Ptr(){} //默认构造

  50

  51 Has_Ptr(const Has_Ptr &rhs){ //拷贝构造

  52 memcpy(this, &rhs, sizeof(rhs));

  53 add_ref();

  54 }

  55

  56 ~Has_Ptr(){

  57 release_ref_count();

  58 }

  59

  60 //赋值

  61 Has_Ptr &operator=(const Has_Ptr &rhs){

  62 //原来的引用计数减1

  63 release_ref_count();

  64 memcpy(this, &rhs, sizeof(&rhs));

  65 //新的引用计数加1

  66 add_ref();

  67 return *this;

  68 }

  69

  70 void set_ptr(int *ptr){

  71 if (ptr != (this->ptr->p)){

  72 this->ptr->p = ptr;

  73 }

  74 }

  75 int* get_ptr(){

  76 return ptr->p;

  77 }

  78};

  79

  80void test(){

  81 int i = 0;

  82 Has_Ptr hp(&i);

  83 int j = 1;

  84 Has_Ptr hp1(&j);

  85 hp1 = hp;

  86}

  87int _tmain(int argc, _TCHAR* argv[])

  88{

  89 test();

  90 return 0;

  91}

  当一个类的成员里面有指针的时候,使用默认拷贝构造函数的时候就会造成多个对象管理同一块内存

  这样带来的后果就是,如果任意一个对象释放了这一块内存,那么其他的对象再来操作这块内存的时候就会发生预料不到的结果。

  为了避免对象中保存野指针从而引发的错误,提出了智能指针, 它能实现多个对象共享内存的自释放。

  其实这种实现有点类似于delphi中的接口,到处传来传去的,最后自释放,就是因为接口有引用计数,当引用计数为1的时候就把对象释放掉。

  C++中这种实现(C++ Primer书上借鉴来的),有几个比较巧妙的地方

  ·Has_Ptr这个类其实是想保存一个int *的指针,为了避免悬垂指针的出现,我们使用了 I_Pointer这个类把悬垂指针包了一下,因此在Has_Ptr这个类的Public接口中不会出现I_Pointer,只会出现int *

  ·事实上也不能出现I_Pointer, 因为Pointer的构造函数定义成Private,不允许在外面构造,只能在friend类中构造,I_Pointer是专门为Has_Ptr实现的

  ·要记住三元组(拷贝构造,赋值操作,析构),当其中一个需要有特殊操作的时候,其他的也需要有特殊操作,这个要形成定势思维。

 

标签分类:

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载