智能指针auto_ptr的简单实现

来源:互联网 发布:怎么获得淘宝代金券 编辑:程序博客网 时间:2024/05/18 19:19

   智能指针有很多实现方式, auto_ptr相对来说 是个比较拙劣的实现, 没有用到引用计数。

所以用起来有很多问题。

   一般来说 引用计数性的智能指针 拷贝一下 成员 计数变量加一个1.  然后当这个计数变为0 的时候 这个实际指向的内存就可以 delete掉了。 这样的话 可以解决auto_ptr被析构两次 打来的问题。


下面这段代码是 auto_ptr的实现  ,在vc2005 编译运行 没有问题, 但是VC6 有问题。 VC6  对于模板的支持很糟糕

  如果这段代码  在VC6  不会调用它的拷贝构造。 

      有个问题就是 more effective C++ 第293-294 页  有对auto_ptr的实现,但是 我不知道是编译器的问题 还是作者有意弄错了  那段代码是编译不过的。

   主要是申明友元类的那段。

       template<class U>  friend class  auto_ptr<U>;

  这段代码注释起来就没问题了 ,这个原因 ,欢迎大家讨论。  下面给出vs2005下  我实现的 auto_ptr.

    望能 抛砖 而 引出 玉来。

template <class T>class  auto_ptr{public:explicit auto_ptr(T * t = 0):ptr(t){ }template <class U>auto_ptr(auto_ptr<U> & src_ptr):ptr(src_ptr.realse()){printf("拷贝构造!\n");}~auto_ptr(){delete ptr;}template <class U>auto_ptr<T> & operator= (auto_ptr<U> &ptr){if (this != &ptr){printf("赋值构造!\n");reset(ptr.realse());}return *this;}T * operator->(){return ptr;}T & operator*(){return *ptr;}T * realse(){T * old = this->ptr;this->ptr = 0;return old;}void reset(T * src = 0){if (src != ptr){delete this->ptr;this->ptr = src;}}private:T * ptr;//template<class U> friend class auto_ptr<U>;};void test(){auto_ptr<int> test(new int);*test = 100;printf("%d\n", *test);auto_ptr<int> test1 ( test);printf("%d \n", *test1);}int main(int argc, char* argv[]){test();system("pause");return 0;}



0 0