C++之 深拷贝和浅拷贝

来源:互联网 发布:如何让win7网络更流畅 编辑:程序博客网 时间:2024/06/18 10:49

#include <iostream>#include <string.h> using namespace std; class Name{public:    Name(const char *p)    {        m_len = strlen(p);        m_p = (char *)malloc(m_len + 1);    }     ~Name()    {        cout << "析构函数被调用" << endl;        if (m_p != NULL)        {            free (m_p);            m_p = NULL;            m_len = 0;        }        cout << "析构函数执行结束" << endl;    }private:    char *m_p;    int m_len;}; int main(){    {        Name name1("xiaoming");        Name name2 = name1;    }     return 0;}



1、浅拷贝程序中存在什么问题?

答:默认复制构造函数可以完成对象的数据成员值简单的复制;

对象的数据资源是由指针指示的堆时,默认复制构造函数仅作指针值复制

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


2、浅拷贝问题解决:深拷贝

自己写拷贝构造,避免浅拷贝。

#include <iostream>#include <string.h> using namespace std; class Name{public:    Name(const char *p)    {        m_len = strlen(p);        m_p = (char *)malloc(m_len + 1);    }     // 解决浅拷贝的方案:手动编写拷贝构造函数,进行深拷贝    Name (const Name &obj)    {        m_len = obj.m_len;        m_p = (char *)malloc(m_len + 1);        strcpy (m_p, obj.m_p);    }     ~Name()    {        cout << "析构函数被调用" << endl;        if (m_p != NULL)        {            free (m_p);            m_p = NULL;            m_len = 0;        }        cout << "析构函数执行结束" << endl;    }private:    char *m_p;    int m_len;}; int main(){    {        Name name1("xiaoming");        Name name2 = name1;    }     return 0;}





原创粉丝点击