为了解决指针悬挂这个问题
有下面两种方法
1、使用智能指针(看了C++primer才知道的)
2、在拷贝构造函数和赋值操作符中为左操作数重新分配资源,然后复制内容(即使用深拷贝)
智能指针是让多个对象的指针指向一个空间,共享这一空间(共享也是有坏处的)
智能指针是使用一个计数器,当该计数器为0时才会释放指针指向的内存
每次创建新类的对象时,初始化指针并将计数置为1
当调用复制构造函数时,计数+1
当调用赋值函数时,左操作数的计数-1,右操作的计数+1
//使用智能指针
#include<iostream>
#include<cstring>
using std::cout;
using std::endl;
class person;
class auto_ptr
{
friend class person;//只想让person类使用,所以全部成员为private
private:
char *name;
int use;
auto_ptr(char *name):name(new char[strlen(name)+1]),use(1){ strcpy(this->name,name);}
~auto_ptr(){ delete name;}
};
class person
{
public:
person():ptr(NULL),age(20){}
person(const person&p):age(p.age),ptr(p.ptr){++(ptr->use);}//计数自加
void set_age(int a){age = a;}
void set_name(char *n){ ptr = new auto_ptr(n);}
person& operator=(const person&rhs);
//当计数为0时,才释放内存
~person(){ if( ptr!=NULL && --(ptr->use)==0) delete ptr;}//&&操作符左边真才判断右边的性质真是太好了
int get_age(){return age;}
char* get_name(){ if(ptr!=NULL) return ptr->name; else return NULL;}
void check_use(){cout<<ptr->use<<endl;}
private:
int age;
auto_ptr *ptr;
};
person& person::operator=(const person&rhs)
{
++(rhs.ptr->use);//先自加,防止自身赋值
if( ptr!=NULL && --(ptr->use) == 0)
delete ptr;
ptr = rhs.ptr;
age = rhs.age;
return *this;
}
int main()
{
person p1;
p1.set_age(10);
p1.set_name("dog");
cout<<p1.get_age()<<endl;
cout<<p1.get_name()<<endl;
person p2;
p2 = p1;
p1.check_use();
p1 = p1;//自身赋值
p1.check_use();
}
如果使用智能指针还是要看类是怎么设计实现的,明白这个思想就好。。
智能指针让我明白了一点点string类 copy on write的思想