一、浅拷贝问题
浅拷贝
首先定义一个Sting类,它包含一个成员变量,一个char*的指针。
namespace CPP
{
class String
{
public:
private:
char* _str;
};
}
对于String类的拷贝构造函数及operator=函数来说,当用一个String对象拷贝构造或赋值给另一个String对象时,就是将这个对象里的指针的值赋值给另一个对象里的指针。将一个指针值赋值给另一个指针,就会使得两个指针指向同一块空间,这就产生了浅拷贝(值拷贝)。
namespace CPP
{
class String
{
public:
//拷贝构造---浅拷贝
String(const String& s)
:_str(s._str)
{}
//赋值
String& operator=(const String& s)
{
if (this != &s)
{
_str = s._str;
}
return *this;
}
//析构函数
~String()
{
if (_str)
{
delete[] _str;
}
}
private:
char* _str;
};
void TestString1()
{
String s1("hello");
String s2(s1);//未写拷贝构造函数时,使用默认的,为浅拷贝(值拷贝)
cout << s2.c_str() << endl;
String s3("world");
s2 = s3;
cout << s2.c_str() << endl;
}
}
这时其实程序已经崩溃了。 问题在于以下两个方面:
① 两个(或两个以上)指针指向同一块空间,这个内存就会被释放多次;(例如下面定义了一个String对象s1,以浅拷贝的方式拷贝构造了一个String对象s2,则s1和s2里面的指针_str就会指向同一块空间;当出了作用域,s2先调用析构函数,而上面代码中析构函数里面进行了空间的释放,也就是这个空间就会被s2释放,接下来会调用s1的析构函数,也会去释放这块空间,释放一块已经不属于我的空间就会出错)
② 另一方面,当两个指针指向同一块空间时,一旦一个指针修改了这块空间的值,另