智能指针有很多实现方式, 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;
}