码迷,mamicode.com
首页 > 其他好文 > 详细

string类的深浅拷贝,写时拷贝

时间:2018-02-06 16:41:29      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:空间   存在   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;
}


string类的深浅拷贝,写时拷贝

标签:空间   存在   end   自己的   out   public   let   内容   nbsp   

原文地址:http://blog.51cto.com/12951882/2069463

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!