标签:his main 访问 重写 16px 解决 strlen str 问题
浅拷贝 : 也称位拷贝 , 编译器只是直接将指针的值拷贝过来, 结果多个对象共用 同 一块内 存, 当一个对象将这块内 存释放掉之后, 另 一些对象不知道该块空间 已经还给了 系 统, 以 为还有效, 所以 在对这段内 存进行操作的时候, 发生了访问违规。
上代码
1 class String 2 { 3 public: 4 /* 浅拷贝---下列代码相当于系统合成的 5 String() 6 { 7 _pStr = new char; 8 *_pStr = ‘\0‘; 9 }*/ 11 String(const char *pStr = "") 12 { 13 if (pStr == NULL) 14 { 15 _pStr = new char[1]; 16 *_pStr = ‘\0‘; 17 } 18 else 19 { 20 _pStr = new char[strlen(pStr) + 1]; 21 strcpy(_pStr, pStr); 22 } 23 } 24 String(const String& s) 25 :_pStr(s._pStr) 26 {} 28 ~String() 29 { 30 if (_pStr) 31 delete[] _pStr; 32 _pStr = NULL; 33 } 35 String& operator=(const String& s) 36 { 37 if (this != &s) 38 { 39 _pStr = s._pStr; 40 } 41 return *this; 42 } 44 private: 45 char *_pStr; 47 };/*存在问题:1.同一对象析构多次,程序崩溃;2.内存泄漏*/
int main()
{
String s1;
String s2 = "hello word";
String s3(s2);
s1[0] = ‘5‘;
String s4;
s3 = s4;
}
编译时可以轻松通过,但是这段代码是有问题的,运行时程序崩溃
这是String类的一个经典反例,下面来具体分析一下这段代码存在的问题:
当类里面有指针对象时, 拷贝构造和赋值运算符重载只进行值拷贝(浅拷贝) , 两个对象指向同一块内 存, 对象销毁时该空间被释放了 两次, 因此程序崩溃!下面的 s1[0] = ‘5‘; String s4; s3 = s4; 也存在类似问题
存在问题:1.同一对象析构多次,程序崩溃;2.内存泄漏
那么该如何解决出现的问题呐?这需要我们自己重写相关类的成员函数,下一篇将介绍多种深拷贝方法以解决此问题
标签:his main 访问 重写 16px 解决 strlen str 问题
原文地址:http://www.cnblogs.com/33debug/p/6657730.html