实现一个简单的智能指针
01// helloworld.cpp : 定义控制台应用程序的入口点。
02//
03
04#include "stdafx.h"
05#include
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"< 16 } 17friend 18 class Has_Ptr; 19}; 20 21//有指针成员的类 22class Has_Ptr{ 23private: [NextPage] 24 I_Pointer *ptr; //指针成员 25 //减少引用计数 26 void release_ref_count(){ 27 cout<<"release reference count"< 28 if(--(ptr->ref_count) == 1){ 29 free_and_nil(); 30 } 31 } 32 //增加引用计数 33 void add_ref(){ 34 cout<<"add reference count"< 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; [NextPage] 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实现的 ·要记住三元组(拷贝构造,赋值操作,析构),当其中一个需要有特殊操作的时候,其他的也需要有特殊操作,这个要形成定势思维。
| 广告合作:400-664-0084 全国热线:400-664-0084 Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号 珠峰网 版权所有 All Rights Reserved
|