您的位置:首页 > 运维架构

对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;
}

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



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

(完)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: