浅拷贝和深拷贝

来源:互联网 发布:如何在u盘上安装ubuntu 编辑:程序博客网 时间:2024/04/30 16:14
class A{public:    A(char * p1 = NULL)    {        if (p1 == NULL)        {            p = new char[1];            p[0] = '\0';        }        else        {            p = new char[strlen(p1) + 1];            strcpy(p, p1);        }    }    ~A()    {        delete[]p;        cout << "destruction" << endl;    }private:    char * p;};int main(){    A a("hello");    A b(a);}

程序运行时出错
这是因为默认的拷贝构造(默认的赋值函数也一样)只是复制了指针(浅拷贝),指向了同一片内存,这样在a,b生命周期结束的时候,会delete这个内存两次,导致程序运行出错,增加以下的代码即可

A(const A& tmp)(深拷贝)    {        p = new char[strlen(tmp.p) + 1];        strcpy(p, tmp.p);    }

总结:浅拷贝只是复制了指针,并没有新分配内存,而深拷贝新分配了内存,并将数据复制了过来

原创粉丝点击