智能指针auto_ptr的简单实现

24 篇文章 0 订阅
24 篇文章 0 订阅

   智能指针有很多实现方式, 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值