首页 > 代码库 > String 类的实现(1)浅拷贝存在的问题

String 类的实现(1)浅拷贝存在的问题

   浅拷贝 : 也称位拷贝 , 编译器只是直接将指针的值拷贝过来, 结果多个对象共用 同 一块内 存, 当一个对象将这块内 存释放掉之后, 另 一些对象不知道该块空间 已经还给了 系 统, 以 为还有效, 所以 在对这段内 存进行操作的时候, 发生了访问违规。

上代码

 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.内存泄漏

 

   那么该如何解决出现的问题呐?这需要我们自己重写相关类的成员函数,下一篇将介绍多种深拷贝方法以解决此问题

 

String 类的实现(1)浅拷贝存在的问题