对scoped_ptr智能指着的实现和测试用例
2016-07-05 23:16
281 查看
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;
}
最后的测试结果如下图所示:
![](https://img-blog.csdn.net/20160705231021965?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
目前为止已经完成了对smart_ptr和scoped_ptr智能指针的功能代码实现,后续文章还会对shared_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等其他智能指针进行功能编码和测试。
(完)
相关文章推荐
- tomcat 的jvm 内存溢出问题的解决
- mitaka版本openstack虚拟化云桌面的实现(spice)
- Shell中获取字符串长度的七种方法
- SPI子系统驱动架构 - 驱动框架
- Nginx安装启动
- 游戏编程模式:前言(架构,性能和游戏)(Part III)
- kvm虚似机监控
- Linux常用命令(1)
- Centos 7 安装 Visual stdio Code
- shell 重启tomcat 脚本
- 架构漫谈:我心中的架构
- backup, file manipulation operations (such as ALTER DATABASE ADD FILE) and encryption changes on a database must be serialized.
- 新手站长学习资料--网站设计…
- PeopleSoft Rich Text Boxes上定制Tool Bars
- tomcat 之memory leak== registered the jdbc driver com mysql jdbc driver
- linux 查找大目录和大文件
- Linux常用的命令--60个命令总结汇总
- Apache shutdown unexpectedly启动错误解决方法
- 每天一个linux命令(36)--vmstat命令
- openstack学习笔记六 多节点部署之keystone