复制控制(管理指针成员)

智能指针

  1. 目的:解决多个对象‘共享内存’问题。

    带有动态分配内存的对象,在用析构函数释放内存的时候,可能出现多次释放的问题:内存泄漏/double free

  2. 方法:跟踪对象:即用一个计数器,记录拷贝的对象个数,通过不断减少计数器里的值达到只释放一次内存的目的



#include <iostream>
#include <cstring>

using namespace std;

class Banji
{
    public:
        Banji():num(10),money(12.2),name(NULL){}

        Banji(char *s, int n, double f)
        {
            name = new char[20];
            strcpy(name, s);

            num = n;
            money = f;
        }

        Banji(const Banji &b)
        {
            cout << "copy constructor..." << endl;
    //      name = new char[20];
            use++;  //计数器跟踪拷贝出来的对象个数
            strcpy(name, b.name);

            num = b.num;
            money = b.money;
        }

        ~Banji()
        {
            cout << "~Banji()...." << endl;
            if(--use==0)
            {
                if(name!=NULL)
                {
                    delete[] name;
                    name = NULL;
                }
            }
        }

        void disp();

        Banji &operator=(const Banji &b);

    private:
        int num;
        char *name;
        static int use;
        double money;
};

int Banji::use = 1;

void Banji::disp()
{
    cout << name << " ";
    cout << num << " ";
    cout << money << endl;
}

Banji &Banji::operator=(const Banji &b)
{
//这是想让this->name 和 b.name指到一块去(即同一内存)
#if 0
    if(this->name!=NULL)
    {
        cout << "this.name !=NULL.." << endl;
        delete[] this->name;
        this->name=NULL;
    }

    cout << "operator=..." << endl;

    this->name = b.name;
#endif
//这是不改变this->name的值,而改变this->name所指内存的数据,达到完完全全的赋值

    strcpy(name, b.name);
    this->num = b.num;
    this->money = b.money;

    return *this;
}

int main()
{
    char *name = {"xinghuang"};
    char *name1 = {"huaxia"};
    char *name2 = {"zhonghua"};

    Banji b1(name, 10, 12.2);
    b1.disp();

    Banji b2 = b1, b3 = b2;
    b2.disp();
    b3.disp();

    b3 = b1;
}

值型指针

作用解决类中指针的 ‘动态内存’ 问题。

实现方法:在上面的拷贝构造函数中将

name = new char[20]

放开。这是通过拷贝时直接创建我独立的内存达到 拷贝对象 与 源对象 互不干扰的目的,当然这也就没有上面的共享内存的事儿了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值