智能指针auto_ptr的简单实现

2014-11-24 03:21:54 · 作者: · 浏览: 0

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

所以用起来有很多问题。

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


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

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

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

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

template friend class auto_ptr ;

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

望能 抛砖 而 引出 玉来。

template 
   
    
class  auto_ptr
{

public:

	explicit auto_ptr(T * t = 0):ptr(t)
	{ 

	}	

	template 
    
      auto_ptr(auto_ptr
      & src_ptr):ptr(src_ptr.realse()) { printf("拷贝构造!\n"); } ~auto_ptr() { delete ptr; } template 
      
        auto_ptr
       
         & operator= (auto_ptr
         &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
         
           friend class auto_ptr
          ; }; void test() { auto_ptr
           
             test(new int); *test = 100; printf("%d\n", *test); auto_ptr
            
              test1 ( test); printf("%d \n", *test1); } int main(int argc, char* argv[]) { test(); system("pause"); return 0; }