在类中有指针成员时,使用复制拷贝函数可以使每一个类的对象都有一份自己的指针成员指向的拷贝,以防止如果被拷贝的对象XIGOU,复制的对象的指针成员成为野指针。
另一种避免这种结果的途径就是智能指针。智能指针的一种实现方式是指针成员所指空间建立一个计数器,而不是区复制这个空间。每当这个拥有这个指针成员的对象被复制一次,这个计数器就加1.
具体情况是这么个样子:
代码:
#include <iostream>
using namespace std;
class RefPtr
{
public:
friend class TestPtr;
int *ptr;
size_t count;
RefPtr(int *p):ptr(p),count(1){}
~RefPtr(){delete ptr;}
};
class TestPtr
{
public:
TestPtr(int *p):ptr(new RefPtr(p)){}
TestPtr(const TestPtr &src):ptr(src.ptr){ ++ptr->count;}
TestPtr& operator=(const TestPtr &rhs)
{
++rhs.ptr->count;
if(--ptr->count == 0)
delete ptr;
ptr = rhs.ptr;
return *this;
}
~TestPtr() {delete ptr;}
//private:
RefPtr *ptr;
};
int main()
{
int a = 123456;
TestPtr t1(&a);
TestPtr t2 = t1;
TestPtr t3 = t2;
cout << "num of count is : " << t1.ptr->count << endl;
cout << "num of count is : " << t2.ptr->count << endl;
cout << "num of count is : " << t3.ptr->count << endl;
return 0;
}
截图不方便,运行结果如下:
num of count is : 3
num of count is : 3
num of count is : 3
所以从t1复制出来的t2,从t2复制出来的t3,它们所指向的空间都是一块,就是RefPtr*,所以RefPtr*中的count自然都是相同的。