« | April 2021 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | |
| 公告 |
☆★☆★☆★☆★☆★☆ 生活的点点记录,以及一些体会...........
喜欢是淡淡的爱,爱是深深的喜欢.
时间会见证一切.......................
欢迎大家指出错误,共同进步..........
期待中..............................
☆★☆★☆★☆★☆★☆ |
Blog信息 |
blog名称: 日志总数:162 评论数量:312 留言数量:0 访问次数:918303 建立时间:2005年5月17日 |

| |
深拷贝与浅拷贝: 软件技术
oceanblue 发表于 2005/6/24 13:42:34 |
深拷贝与浅拷贝:
前提:用一个对象构造另外一个对象;
特征:被复制对象的构造函数中,有成员变量申请了堆内存空间
Eg: class Person
{
public:
Person(char* pN)
{
m_pName = new char[strlen(pN)+1];
if(m_pName!=NULL)
strcpy(m_pName,pN);
}
~Person()
{
cout<<"Destructing "<<m_pName<<endl;
delete []m_pName;
}
protected:
char * m_pName;
};
浅拷贝:
Void main()
{
Person p1(“Andy”);
Person p2 = p1;或者 Person p2(p1);
}
此时会发生ERROR,Person p1,p2中的成员变量m_pName指向的是同一段堆内存,当P1析构时,已经释放了该堆内存。
当对一段堆内存delete两次时,会出错。因此,当P2析构函数执行时,内存会出错。
深拷贝:
在class Person 中增加一个Person类拷贝构造函数,为P2的成员变量m_pName重新分配一段堆内存;
Person(Person &p)
{
m_pName = new char[strlen(p.m_pName)+1];
if(m_pName!=NULL)
strcpy(m_pName,p.pName);
}
|
|
|