关于C++编程过程中遇到的深拷贝和引用计数

在面向对象的编程过程中,深拷贝问题:

1. 构造函数中有动态分配内存。

2.在赋值函数中,通过直接赋值时会造成被赋值对象并没有分配内存,只是将被赋值对象内部的指针指向赋值对象动态分配好的地址,一旦赋值对象被销毁,被赋值对象内部的指针指向内容已被销毁,会造成无效引用,造成浅拷贝问题。

解决办法:

通过引用计数解决问题,在赋值函数和赋值拷贝构造函数中将计数+1,析构是对计数进行判断再销毁。

class Data{
    public:
        Data():data(nullptr), ref(1){ dat = new int(0);}
        ~Data(){if(dat) delete dat, dat=nulltr;}

        Data(const Data &)=delete;
        Data & operator=(const Data &)=delete;

        int *dat;
        int ref;
};

class A{
    public:
        A();
        ~A();

        A(const A &);
        A& operator=(const A &a);

    private:
        Data *d;
};



A::A()
:d(new Data()){}

A::~A()
{
    if(d && !--d->ref)
        delete d;
}

A::A(const A& ia)
   :d(ia.d)
{
    if(d)
        d->ref++;
}


A& A::operatar=(const A& ia)
{
    if(this == *ia)
        return *this;
    if(ia.d)
        ++ia.d->ref;

    Data *old_d = d;
    d = ia.d;
    if(old_d && !--old_d->ref)
        delete old_d;
    return *this;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值