string (const char * pstr="")
:_pstr(new char [strlen(pstr)+1])
{
strcpy(_pstr,pstr);
}
void test ()
{
string s1 ="asd";
string s2(s1);
}
此时s2用string的拷贝构造来实现,如果没有显示实现,则使用系统默认的拷贝构造函数。
此时s1,s2都指向同一片保存数据的空间,那么当调用析构函数的时候,销毁s1的时候,该空间已经释放,s2的指针成为野指针,当调用析构函数的时候会报错。
我们把此类不同对象指向同一片空间的拷贝称为浅拷贝。常见的有传值拷贝。
浅拷贝:也称位拷贝,编译器只是将对象中的值拷贝过来。如果对象中管理资源,最后就会导致多个对象共享同一份资源,当一个对象销毁时就会将该资源释放掉,而此时另一些对象不知道该资源已经被释放,以为还有效,所以当继续对资源进项操作时,就会发生发生了访问违规。
如果一个类中涉及到资源的管理,其拷贝构造函数、赋值运算符重载以及析构函数必须要显式给出。一般情况都是按照深拷贝方式提供。
string(const string & s)
:_pstr(new char [strlen(s._pstr)+1])
{
strcpy (_pstr ,s._pstr);
}
此时拷贝需要给每个对象单独分配资源,保证每个对象不会因为共享资源而导致程序崩溃。