- 当类申请了堆中的资源,既类的成员使用
new
函数在堆中申请内存,并且进行了类的复制操作时,会出现这个问题。
- 浅拷贝就是多了一个指针,指向了原来的内存,深拷贝是增加了一个指针,并且指向了原来的函数。
举例
class String {
private:
char * str;
public:
String() :str(NULL) { }
const char * c_str() const { return str; };
String & operator = (const char * s);
~String();
};
String s1, s2;
s1 = "this";
s2 = "that";
s2 = s1;
- 这种情况是,此时s2和s1指向了同一段内存,同时s2所指的内存将会成为内存垃圾,可能导致泄露。而我们需要的复制是两个指针指向的内存中的内容相同,于是我们对
=
进行重载
String & String::operator = (const String & s)
{
if(str == s.str)
return * this;
if(str)
delete[] str;
if(s.str){ //s. str不为NULL才执行复制操作
str = new char[ strlen(s.str) + 1 ];
strcpy(str, s.str);
}
else
str = NULL;
return * this;
}
参考资料