对scoped_ptr智能指着的实现和测试用例

29 篇文章 1 订阅
3 篇文章 0 订阅

scoped_ptr

1)是一个智能指针,不能用delete销毁它

2)scoped_ptr智能指针只能有一份,因为scoped_ptr禁止了对智能指针的拷贝,通过将拷贝构造函数和赋值操作符都private化。

3)scoped_ptr保管的原始指针是new出来的在堆上分配的动态对象(此对象的释放,由scoped_ptr来释放)

4)scoped这个前缀的含义正是scoped_ptr智能指针提供的主要功能:这个智能指针只希望在当前代码块区域里使用,如果脱离了当前区域,scoped_ptr智能指针就会自动释放保管的原始指针。

5)第4)点的实现机制是:用一个栈上的对象A管理一个堆上的对象B,当脱离了A所在代码块区域时,A会被析沟,A的析沟函数内部用delete释放对象B,所以当A被析沟时,堆上的对象B也被析沟了。记住:原始指针new出来以后,就不需要再关心什么时候去delete,scoped_ptr自动帮助我们释放原始指针!

6)scoped_ptr用operator*()和operator->()重载了解引用操作符*和箭头操作符->,目的:模仿被保管的原始指针的行为,从而达到像使用原始指针一样使用scoped_ptr智能指针

7)scoped_ptr  ptr用operator bool()重载了bool操作,ptr可以在bool语境中可以自动被转换成bool值(如if、while、assert等表达式中)

8)scoped_ptr还不提供!=和==操作,即两个只能scoped_ptr指针不能进行相等比较和不相等比较

9)scoped_ptr不允许拷贝和赋值,拒绝了指针所有权的转让,只能在scoped_ptr被声明的作用域内使用----除了scoped_ptr自己,其他任何人都无权访问被管理的指针,从而保证了指针的绝对安全!

10)请尽量不要使用scoped_ptr提供的reset接口,否则违背了scoped_ptr拒绝转让指针所有权的本意。

11)有个小要求:对于原始指针的析沟函数不能不能抛出异常。要求也是合理的。


下面是对scoped_ptr智能指针的实现代码和测试用例。

注:对于scoped_ptr的有的接口没有实现,但是对于scoped_ptr的基本和主要功能接口和关键操作符都实现了,最后给出了测试用例,可以看出来,最后体现了栈上对象管理堆上对象的价值和特点。


#include <stdio.h>

#define PRINT_FUNC_INFO \
	do { \
		printf("%s:%d:%s\n", __FILE__, __LINE__, __FUNCTION__);\
	}while(0);

template<class T> inline void check_delete(T* ptr)
{
	typedef char complete_type[sizeof(T) ? 1 : -1];
	(void) sizeof(complete_type);
	delete ptr;
}

template<class T> class TScoped_ptr //noncopyable
{
private:
	T* m_ptr;//原始指针
	TScoped_ptr(TScoped_ptr const&);//拷贝构造函数
	TScoped_ptr& operator=(TScoped_ptr const&); //赋值操作
	
	void operator==(TScoped_ptr const&) const;//operator==相等操作
	void operator!=(TScoped_ptr const&) const;//operator!=不等操作
public:
	//显式构造函数
	explicit TScoped_ptr(T* ptr = 0):m_ptr(ptr)
	{}
	~TScoped_ptr()//析构函数
	{	
		PRINT_FUNC_INFO
		check_delete(m_ptr);
	}
	void reset(T* ptr = 0)//重置智能指针的原始指针
	{
		assert (ptr == 0 || ptr != m_ptr);
		TScoped_ptr(ptr).swap(*this);
	}
	T& operator*() const//引用解析操作符*
	{
		return *m_ptr;
	}
	T* operator->() const//箭头操作符->
	{
		return m_ptr;
	}
	T* get() const//获得原始指针
	{
		return m_ptr;
	}
	bool operator!() const
	{
		return m_ptr == 0;
	}
	void swap(TScoped_ptr& other)
	{
		T* tmp = other.m_ptr;
		other.m_ptr = m_ptr;
		m_ptr = tmp;
	}
}; //class TScoped_ptr

class CDog
{
public:
	CDog() {
		PRINT_FUNC_INFO
	};
	~CDog() {
		PRINT_FUNC_INFO
	}
	void Run() {
		PRINT_FUNC_INFO
	}
};//class CDog

int main()
{
	CDog *pdog = new CDog;
	TScoped_ptr<CDog> ptr(pdog);
	ptr->Run();
	(*ptr).Run();
	ptr.get()->Run();
	printf("ptr is:%s\n", !ptr ? "NULL" : "NOT-NULL");
	return 0;
}

最后的测试结果如下图所示:



目前为止已经完成了对smart_ptr和scoped_ptr智能指针的功能代码实现,后续文章还会对shared_ptr等其他智能指针进行功能编码和测试。

(完)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值