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

来源:互联网 发布:手机视频剪辑软件中文 编辑:程序博客网 时间:2024/06/16 02:53
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 charvector<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使用写时复制