深拷贝与浅拷贝

来源:互联网 发布:svd 协同过滤推荐算法 编辑:程序博客网 时间:2024/06/05 01:55

深拷贝和浅拷贝
浅拷贝:在拷贝指针的时候只是拷贝了地址,不会进行空间的复制

class Test8_1{public:    Test8_1(int id, char *name)    {        m_id = id;        m_name = (char *)malloc(sizeof(char)* 20);        strcpy(m_name, name);    }    ~Test8_1()    {        if (m_name != NULL)        {            free(m_name);            m_name = NULL;        }        printf("析构函数被调用*********\n");    }    void print()    {        printf("id = %d, name = %s\n", m_id, m_name);    }private:    int m_id;    char *m_name;};int main(){    Test8_1 t1(10, "wang");    t1.print();    Test8_1 t2 = t1;    return 0;}

这个函数就是一个浅拷贝构造,如果只创建一个对象t1,不会有太多问题,但如果将t1赋给新对象t2,此时就会发生问题了,我们知道在程序结束时,析构函数会释放掉开辟的空间,因为我们创建了两个对象,所以析构函数就会释放两次,那么问题来了,我们只malloc了一次,即只开辟了一快空间,于是就出现了访问非法内存的问题,程序也就崩了。

那么如何避免这一问题呢?

我们可以进行深拷贝
浅拷贝是只复制了地址,没有复制空间,而深拷贝就进行的很彻底,把空间也复制了一份
在上面的函数中我们只要自己写一个拷贝构造函数就可以解决这一问题了

Test8_1(const Test8_1 &obj){    m_id = obj.m_id;    m_name = (char *)malloc(sizeof(char)*20);    strcpy (m_name, obj.m_name);}