标签:空间 存在 end 自己的 out public let 内容 nbsp
string类的深浅拷贝,写时拷贝浅拷贝:多个指针指向同一块空间,多次析构同一块内存空间,系统会崩溃。(浅拷贝就是值拷贝)
深拷贝:给指针开辟新的空间,把内容拷贝进去,每个指针都指向自己的内存空间,析构时不会内存崩溃。
#include <iostream>
#include <string>
using namespace std;
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 String& str)
//{
// if(this!= &str)
// {
// _str = str._str;
// }
// return *this;
//}
String(const String& str) //深拷贝
:_str(new char[strlen(str._str)+1])
{
strcpy(_str,str._str);
}
String &operator=(const String& str)
{
if(this!=&str)
{
//delete[] _str;
//_str=new char [strlen(str._str)+1];
//strcpy(_str,str._str);
_str=str._str;
}
return *this;
}
~String()
{
if(_str)
{
cout<<"~String()"<<endl;
delete[] _str;
}
}
private:
char*_str;
};
void TestString()
{
String s1("hello world!");
String s2=s1;//s2(s1)
}
int main()
{
TestString();
return 0;
}写时拷贝:会存在一个计数器,并且多个对象指向同一块空间,每次创建一个新的对象时计数器加++,销毁时计数器--,直到计数器count=0时析构。
class String
{
public:
String(const char*str)
:_str(new char [strlen(str)+1])
,_count(1)
{
strcpy(_str,str);
}
String(const String& str)
:_str(str._str)
{
_count++;
}
String &operator=(const String& str)
{
if(this!= &str)
{
_str = str._str;
}
return *this;
}
~String()
{
if(--_count == 0)
{
cout<<"~String()"<<endl;
delete[] _str;
}
}
private:
char*_str;
int _count;
};
void Test()
{
String s1("hello world!");
String s2=s1;
String s3 = s2;
}
int main()
{
Test();
return 0;
}标签:空间 存在 end 自己的 out public let 内容 nbsp
原文地址:http://blog.51cto.com/12951882/2069463