一 概述:(详见primer 13.5)
大多数C++类采用下列三种方法之一管理指针成员:
1.指针成员采取常规指针型行为。这样的类具有指针的所有缺陷(比如:悬挂指针)但无需特殊的复制控制。
2.类可以实现“智能指针”行为。指针所指的对象是共享的,但类能够防止悬挂指针。(引用计数)
智能指针(smart pointer)的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针。
每次创建类的新对象时,初始化指针并将引用计数置为1;当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数;对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果引用计数为减至0,则删除对象),并增加右操作数所指对象的引用计数;调用析构函数时,析构函数减少引用计数(如果引用计数减至0,则删除基础对象)。
实现引用计数有两种经典策略:一是引入辅助类,二是使用句柄(handle)类。
3.类采取值型行为(深拷贝)。指针所指的对象是唯一的,由每个类对象独立管理。
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
//智能指针,使用计数类
#include<iostream>
using namespace std;
class U_Ptr//计数类,用来封装计数和相关指针
{
private:
friend class Base;
U_Ptr(int *p):ip(p),use(1){}
~U_Ptr()
{
cout<<"~U_Ptr"<<endl;
delete ip;
}
int *ip;
size_t use;
};
class Base
{
public:
Base(int *p,int i):ptr(new U_Ptr(p)),val(i){}
Base(const Base &orig):ptr(orig.ptr),val(orig.val)
{
++ptr->use;
}
Base &operator=(const Base &orig)
{
++orig.ptr->use;//防止自我赋值
if(--ptr->use==0)delete ptr;
ptr=orig.ptr;
val=orig.val;
return *this;
}
~Base()
{
cout<<"~base"<<endl;
if(--ptr->use==0)
delete ptr;
}
void Size()
{
cout<<ptr->use<<endl;
}
private:
U_Ptr *ptr;
int val;
};
int main()
{
int a=10,c=20;
Base b(&a,c);
b.Size();
Base d(b);
b.Size();
}
//深拷贝
class Base
{
public:
Base(const int &p,const int i):ptr(
new int(p)),val(i){}
Base(Base &orig):ptr(new int(
*orig.ptr)),val(orig.val){}//
注意不再复制指针,而是值
Base &operator=(const Base &orig)//
不需要分配新的对象
{
*ptr=*orig.ptr;//注意这里传递的是值
val=orig.val;
return *this;
}
private:
int *ptr;
int val;
};