深拷贝与浅拷贝

来源:互联网 发布:手机p2p软件下载 编辑:程序博客网 时间:2024/06/05 07:09

浅复制:逐行逐字节的复制工作

class MyString{    public:        MyString():str(nullptr){};        ~MyString();        const char* c_str(){return str;};        char* operator=(const char* s)    private:        char* str;};char* MyString::operator=(const char* s){    if(str)    {        delete[] str;    }    if(s)//s不为空的时候执行拷贝操作    {        str = new char[strlen(s)+1];        strcpy(str,s);    }    else        str = nullptr;    return str;}

这里写图片描述
假如,我们自己实现了String类,重载了”=”操作,里边有一个字符指针。刚开始,s1.str指向this,s2.str指向that,当执行s1=s2时,s1与s2的str同时指向that所在的存储区。这样就会造成两个问题:1)没有指针指向this所在的内存空间使得这片内存空间无法被访问从而成为内存垃圾。2)当s1与s2同时消亡时, that所在的内存空间时,由于有两个指针指向该片区域,故这片区域会被释放两次,这也会引发内存问题。
深复制:将对象中指针成员变量指向的内容,复制到另一个对象中指针指针成员指向的地方,具体的过程如下图所示
这里写图片描述
实现代码如下:

MyString& operator=(const char& s){    if(str) delete[] str;    str = new char[strlen(s)+1];    strcpy(str,s);    return *this;}
原创粉丝点击