程序员面试题精选100题(15)-含有指针成员的类的拷贝[C/C++/C#](2)

时间:2019-09-22 编辑:多美文
      {
            if(this == &copy)
                  return *this;

            if(data != NULL)
            {
                  delete []data;
                  data = NULL;
            }

            size = copy.size;
            if(size > 0)
            {
                  data = new T[size];
                  for(int i = 0; i < size; ++ i)
                        setValue(i, copy.getValue(i));
            }
      }

为了防止有多个指针指向的数据被多次删除,我们还可以保存究竟有多少个指针指向该数据。只有当没有任何指针指向该数据的时候才可以被删除。这种思路通常被称之为引用计数技术。在构造函数中,引用计数初始化为1;每当把这个实例赋值给其他实例或者以参数传给其他实例的构造拷贝函数的时候,引用计数加1,因为这意味着又多了一个实例指向它的data;每次需要调用析构函数或者需要把data赋值为其他数据的时候,引用计数要减1,因为这意味着指向它的data的指针少了一个。当引用计数减少到0的时候,data已经没有任何实例指向它了,这个时候就可以安全地删除。实现的代码如下:

public:
      Array(unsigned arraySize)
            :data(0), size(arraySize), count(new unsigned int)
      {
            *count = 1;
            if(size > 0)
                  data = new T[size];
      }

      Array(const Array& copy)
            : size(copy.size), data(copy.data), count(copy.count)
      {
            ++ (*count);
      }

      ~Array()
      {
            Release();
      }


      const Array& operator = (const Array& copy)
      {
            if(data == copy.data)
                  return *this;

            Release();

            data = copy.data;
            size = copy.size;
            count = copy.count;
            ++(*count);
      }

 private:
      void Release()
      {
            --(*count);
            if(*count == 0)
            {
                  if

本文已影响
相关文章