智能指针有很多实现方式, auto_ptr相对来说 是个比较拙劣的实现, 没有用到引用计数。
所以用起来有很多问题。
一般来说 引用计数性的智能指针 拷贝一下 成员 计数变量加一个1. 然后当这个计数变为0 的时候 这个实际指向的内存就可以 delete掉了。 这样的话 可以解决auto_ptr被析构两次 打来的问题。
下面这段代码是 auto_ptr的实现 ,在vc2005 编译运行 没有问题, 但是VC6 有问题。 VC6 对于模板的支持很糟糕
如果这段代码 在VC6 不会调用它的拷贝构造。
有个问题就是 more effective C++ 第293-294 页 有对auto_ptr的实现,但是 我不知道是编译器的问题 还是作者有意弄错了 那段代码是编译不过的。
主要是申明友元类的那段。
template
这段代码注释起来就没问题了 ,这个原因 ,欢迎大家讨论。 下面给出vs2005下 我实现的 auto_ptr.
望能 抛砖 而 引出 玉来。
templateclass 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; }