STL以及内存以及类的默认函数-题目

String::String( void )
{
	m_str_data = new char[1];
	m_str_data[0] = '\0';
}

String::String( const char* str )
{
	if ( str == NULL )
	{
		m_str_data = new char[1];
		m_str_data[0] = '\0';
	}
	else
	{
		int nc_len = strlen( str );
		m_str_data = new char[ nc_len + 1 ];
		memcpy( m_str_data , str , nc_len * sizeof( char ) );
		m_str_data[nc_len] = '\0';
	}
}

String::String( const String& obj )
{
	int nc_len = strlen( obj.m_str_data );
	m_str_data = new char[ nc_len + 1 ];
	memcpy( m_str_data , obj.m_str_data , nc_len * sizeof( char ) );
	m_str_data[nc_len] = '\0';
}

String::~String( void )
{
	if ( m_str_data )
	{
		delete[] m_str_data;
		m_str_data = NULL;
	}
}

String& String::operator =( const String& obj )
{
	if ( this == &obj )
	{
		return *this;
	}

	if ( m_str_data )
	{
		delete []m_str_data;
		m_str_data = NULL;
	}

	int nc_len = strlen( obj.m_str_data );
	m_str_data = new char[ nc_len + 1 ];
	memcpy( m_str_data , m_str_data , nc_len * sizeof( char ) );
	m_str_data[nc_len] = '\0';

	return *this;
}


 

		//假定String类已经定义了构造函数和拷贝构造函数等,都按深度复制的规范
		String strTest = "abc";			  //构造函数 使用new运算符 new char
		vector<String> vec; 
		vec.push_back( strTest ); //push_back参数是引用型,如果是值的话那又会产生一个string的临时对象
								  //函数内部生成一个对象会调用 拷贝构造函数 new char
								  //stl内部为它管理的对象分配内存使用内存池 调用::operator new(size_t)来产生大块内存
								  //String对象在vertor的内存池中分配内存 使用plmentnew

如果不是自己定义的String,而是使用stl中的string,则结局又不一样。

string为小字符串使用数组形式的栈内存

 union _Bxty
  { // storage for small buffer or pointer to larger one
  _Elem _Buf[_BUF_SIZE];
  _Elem *_Ptr;
  } _Bx;
 

注意stl中的string使用写时复制

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值