拷贝构造与拷贝赋值
对于带有指针的类,常出现这两个构造函数
拷贝构造函数(深拷贝)
处理问题如下
- String s2 = s1
- String s2(s1)
对于编译器默认生成的赋值操作其实是一种浅拷贝,容易造成内存泄漏。
深拷贝构造函数如下:
String(const String &str){
m_data = new char[strlen(str.m_data)+1];
strcpy(m_data,str.m_data);
}
拷贝赋值函数
处理问题如下:
s2 = s1
拷贝赋值函数如下:
String& operator=(const String &str){
if(this==&str){ //检测自我赋值
return *this;
}
delete[] m_data;
m_data = new char[strlen(str.m_data)+1];
strcpy(m_data,str.m_data);
return *this;
}
若没有自我赋值的检测,程序可能会出错。例如真的出现str和this指向同一内存地址,则delete[]后,str和this相同的指向地址已经被删除,当再访问str求大小时,会出错。