防止指针悬挂的方法

为了解决指针悬挂这个问题
有下面两种方法
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;}
    charget_name(){ if(ptr!=NULLreturn ptr->nameelse return NULL;}
    void check_use(){cout<<ptr->use<<endl;}
private:
    int age;
    auto_ptr *ptr;
    
};
personperson::operator=(const person&rhs)
{
    ++(rhs.ptr->use);//先自加,防止自身赋值
    ifptr!=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的思想




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值