最近学习智能指针,剖析了智能指针scoped_ptr代码,通过底层代码的学习才真正理解了智能指针操作原理和使用方法,下面简单地把智能指针scoped_ptr一些关键代码解析展示并说明如下:
#include<iostream>
//#include<boost/smart_ptr.hpp>//这是boost库里的智能指针引用头文件
using namespace std;
template<class T>
class scoped
{
private:
T *px;
scoped(const socped<T> &b)
{}
scoped operator=(const socped<T> &b)//要注意的是scoped_ptr禁止拷贝和复制,所以在这里设置为私有方法
{}
public:
scoped(T *p = 0):px(p)
{}
~scoped()
{
delect px;
}
public:
T & operator *()
{
return *px;
}
T & operator<<()
{
return *px;
}
public:
void reset(T & q)
{
thistype(q).swap(*this);//关键所在,为了不造成内存泄漏专门设计一个临时对象来管理不用的空间,在临时对象死亡的时候析构会释放空间。
}
void swap(scoped<T> &b)
{
T * tmp = b.px;
b.px = px;
px =tmp;
}
};
int main()
{
int *p = new int(10);
int * q = new int(20);
scoped<int> ps(p);
cout<<ps<<endl;
ps.reset(q);
cout<<ps<<endl;
return 0;
}
输出结果:
10
20
检测内存不会发生泄漏,原因就在reset方法的巧妙释放了p空间。
如果是要使用库里智能指针,在有的编译器里可能没有承载智能指针环境,需要自己在网上下载好智能指针基础代码文件,放入编译器里的include文件夹中,把很多为了实现跨平台主键删除了大大减少了代码的复杂度,关键点也已经之处,读者仔细阅读,尤其在空间的操作上非常巧妙的避过了内存泄漏,只能说发明者智慧过人,设计有先见之明。