- 浅拷贝
从内存的角度来说,浅拷贝就是简单的给已经存在的内存增加了一个指针对象,这个新指针和原来的指针指向同一个内存,这样存在内存崩溃的问题,当释放内存的时候会重复释放同一块内存导致内存崩溃.
举例一个简单的赋值浅拷贝
class String{
public:
String(const char *str)
:_str(new char[strlen(str)+1])
{
strcpy(_str,str);
}
String(const String &str)
:_str(str._str)
{}
String &operator=(const Sting &str)
{
if(this!=&str)
{
_str=str;
}
return *this;
}
~String()
{
if(str)
{
delete[]_str;
}
}
private:
char*_str;
};
void Test()
{
String s1("hello world");
String s2=s1;
}
- 深拷贝
深拷贝就是在拷贝构造的时候,对目标内存进行拷贝然后进行另外开辟空间,把目标文件的内容考进新开辟的空间,它比浅拷贝的优点是当你释放内存的时候不会造成对同一块空间多次释放,造成内存出错。
class String{
public:
String(const char*str)
:_str(new char[strlen(str)+1])
{
strcpy(_str,str);
}
String(const String &str)
:_str(new char[strlen(str._str)+1)
{
strcpy(_str,str);
}
String &operator=(const Sting &str)
{
if(this!=&str)
{
char*tmp=new char[strlen(str._str)+1];
strcpy(tmp,str._str);
delete[]_str;
_str=tmp;
return *this;
}
}
~String()
{
if(str)
{
delete[]_str;
}
}
const char*c_str()
{
return _str;
}
private:
char*_str;
};