一个空类有六个缺省函数,分别为构造、析构、拷贝、赋值、取址、带const的取址函数。
类的缺省赋值函数就是浅拷贝。
#include "stdafx.h"
#include "MyString1.h"
int main(int argc, char* argv[])
{
CMyString m("Test~");
CMyString m1 = m;
return 0;
}
当我运行时程序就会崩溃。。。
开启调试模式QAQ
可以看到,浅拷贝就是直接拷贝了地址,可是一旦地址所对应内容发生了变化,而你却不知道,那么程序就会呵呵哒。
下面给你们边看边解释:
当程序运行到最后的时候就会调用析构函数,第一次调用完析构函数的时候然后就会这样
当第二次调用的时候就会崩溃,因为两次delete了指向同一地址的指针。
那么接下来就说深拷贝:
深拷贝是将该地址所存的内容拷贝过去,所以是不同的两个地址,当释放的时候就不存在上面的情况。
我在类中增加了带参构造函数,如下:
CMyString::CMyString(CMyString &m)
{
if(this != &m)
{
if(NULL != m.m_pStr)
{
StrCopy(m.m_pStr);
}
}
}
程序变成了深拷贝。
调试君出场~~~
在深拷贝的情况下,此时的地址是不同的。
总结来说就是
,
在有指针的情况下,浅拷贝只是增加了一个指针指向已经存在的内存,而深拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存,采用深拷贝的情况下,释放内存的时候就不会出现在浅拷贝时重复释放同一内存的错误!