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

来源:互联网 发布:2016国家政策 云计算 编辑:程序博客网 时间:2024/05/22 02:06

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_INFOcheck_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_ptrclass CDog{public:CDog() {PRINT_FUNC_INFO};~CDog() {PRINT_FUNC_INFO}void Run() {PRINT_FUNC_INFO}};//class CDogint 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