对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等其他智能指针进行功能编码和测试。
(完)
- 对scoped_ptr智能指着的实现和测试用例
- 对shared_ptr智能指针的功能代码实现和测试
- 智能指针:auto_ptr 和 scoped_ptr
- 智能指针的模拟实现 auto_ptr scoped_ptr shared_ptr
- 智能指针(还缺少scoped_ptr的模拟实现)
- 智能指针scoped_ptr,shared_ptr,weak_ptr和auto_ptr的使用
- 智能指针:模拟实现auto_ptr,scoped_ptr,shared_ptr
- 智能指针auto_ptr、scoped_ptr、shared_ptr和weak_ptr
- 自己实现的C++智能指针的功能代码和测试用例
- 模拟实现C++/boost库智能指针auto_ptr scoped_ptr和share_ptr
- 智能指针scoped_ptr组件的使用
- 【C++】智能指针的作用,模拟实现auto_ptr,scoped_ptr,shared_ptr,scoped_array,shared_array
- 指着变量例10.11
- 智能指针 boost(scoped_ptr,scoped_array,shared_ptr,shared_array) 和 std (auto_ptr)的比较 .
- 模拟实现auto_ptr、scoped_ptr、shared_ptr等智能指针
- 数组指针和指着数组
- Boost智能指针——scoped_ptr和shared_ptr
- 学习笔记四:boost智能指针:scoped_ptr和shared_ptr
- 华为机试题--2.计算字符个数
- C++ 创建快捷方式的最简单方法
- EditText属性设置
- KL散度及其python实现
- C++ 成员函数的重载、覆盖与隐藏
- 对scoped_ptr智能指着的实现和测试用例
- objective-c 编程基础(七 块)
- “爱运动管理系统”诞生记(10)
- VC编程经验汇总(一)
- UITableView代理cellForRowAtIndexPath不执行的相关解决方案
- 嵌套矩形问题
- 迭代算法的收敛性
- 【分享】传颂之物1+2虚伪的面具 序章【汉化硬盘版】[全CG存档&攻略+英化补丁]
- java多线程系列02