华夏站长网 - 打造最牛逼最高调的程序网站

华夏站长网

当前位置: 网络技术 > PHP源码 >

智能指针_WJDID的空间

时间:2011-09-30 02:27来源:未知 作者:111 点击:
实现一个简单的智能指针 // helloworld.cpp : 界说节制台应用轨范的进口点。//#include stdafx.h #includeiostreamusing namespace std;//指针类class I_Pointer{private: int ref_count; int *p; I_Pointer(int *p): p(p), ref_

实现一个简单的智能指针

// helloworld.cpp : 界说节制台应用轨范的进口点。//#include "stdafx.h" #include<iostream>using namespace std;//指针类class I_Pointer{private: int ref_count; int *p; I_Pointer(int *p): p(p), ref_count(1){}; //机关函数 ~I_Pointer(){ cout<<"Delete shared pointer"<<endl; }friend class Has_Ptr;};//有指针成员的类class Has_Ptr{private: I_Pointer *ptr; //指针成员 //削减引用计数 void release_ref_count(){ cout<<"release reference count"<<endl; if(--(ptr->ref_count) == 1){ free_and_nil(); } } //增添引用计数 void add_ref(){ cout<<"add reference count"<<endl; ++(ptr->ref_count); } //指针释放 void free_and_nil(){ delete ptr; ptr = NULL; }public: // 带int指针的机关函数 Has_Ptr(int *ptr): ptr(new I_Pointer(ptr)) { add_ref(); } Has_Ptr(){} //默认机关 Has_Ptr(const Has_Ptr &rhs){ //拷贝机关 memcpy(this, &rhs, sizeof(rhs)); add_ref(); } ~Has_Ptr(){ release_ref_count(); } //赋值 Has_Ptr &operator=(const Has_Ptr &rhs){ //原本的引用计数减1 release_ref_count(); memcpy(this, &rhs, sizeof(&rhs)); //新的引用计数加1 add_ref(); return *this; } void set_ptr(int *ptr){ if (ptr != (this->ptr->p)){ this->ptr->p = ptr; } } int* get_ptr(){ return ptr->p; }};void test(){ int i = 0; Has_Ptr hp(&i); int j = 1; Has_Ptr hp1(&j); hp1 = hp;} int _tmain(int argc, _TCHAR* argv[]){ test(); return 0;}

  当一个类的成员琅缦沔有指针的时辰,使用默认拷贝机关函数的时辰就会造成多个对象打点统一块内存

这样带来的后不美观就是,如不美观肆意矣闽对象释放了这一块内存,那么其他的对象再来操作这块内存的时辰就会发生预料不到的结不美观。

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

  其拭魅这种实现有点近似于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实现的 要记住三元组(拷贝机关,赋值操作,析构),当其一一个需要有非凡操作的时辰,其他的也需要有非凡操作,这个要形成定势思维。
(责任编辑:111)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片