欢迎使用优快云-markdown编辑器


[C++内存分配]
的一篇好文章
重新了解了深拷贝和拷贝构造函数的用途!

#include<iostream>
using namespace std;

class Test
{
public:
    int size;
    int *p;
    Test(int s)             //带参数的构造函数
    {
        size = s;
        p = new int[size];
        for (int i = 0; i < s; i++)
            p[i] = i;
    }
    Test()                  //不带参数的构造函数
    {
        size = 0;
        p = NULL;//size=0,分配内存有个卵用,之前写的是p = new int[size];
    }
    Test* clone(Test& t) //  这里不能直接用 Test t,否则这个 t是将t1复制一份出来,包括里面的*p,
    //当退出clone时,会析构这个复制的t,但这个复制的t 与t1中的*p是指向同一个地方,此时,*p又会删除2次
    {
        Test *result = new Test(t.size);
        result->size = t.size;
        cout << result->size << " is size" << endl;

        for (int i = 0; i < result->size; i++)
            result->p[i] = t.p[i];
        //result.p = t.p;
        return result;
    }
    ~Test()                    //析构函数
    {
            if(NULL!=p)
            {
                  delete []p;
            }           //这行注释掉程序就不会错
    }
};

int main()
{
    Test t1 = Test(10);
    Test *t2 = t1.clone(t1);
    int i;
    for (i = 0; i != t2->size; i++)
    {
        t2->p[i] = 0;
    }
    cout << "it is over" << endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值