在C语言中我们用指针来进行内存管理,这也是C语言的强大之处。然而,也正是指针的存在使得C语言变得令人懊恼,内存泄漏、垂悬指针等等问题。强大的C++则采用智能指针(Smart_Ptr)来处理这个问题.
好了,什么是智能指针呢?智能指针的行为类似常规指针,重要的区别是它负责自动释放所指向的对象。这样以防止内存泄漏。
智能指针都有哪些种类呢?
通过上述表格可以看出有如此多的智能指针,C11标准库已经引进unique_ptr/shared_ptr/weak_ptr供我们使用。
下面来简单谈谈这些指针的原理和实现。
First——>auto ptr
auto ptr的实现原理主要是管理权的转移。它是所拥有的对象的唯一拥有者,也就是一个对象只有一个拥有者。
代码实现:
template <class T>
class AutoPtr
{
public:
AutoPtr(T* Ptr)
:_Ptr(Ptr)
{}
~AutoPtr()
{
if(_Ptr!=NULL)
{
delete _Ptr;
}
}
AutoPtr(AutoPtr<T>& ap)
{
_Ptr=ap._Ptr;
ap._Ptr=NULL;
}
AutoPtr<T> operator=(AutoPtr<T>& ap)
{
if(&ap!=this)
{
delete _Ptr;
_Ptr=ap._Ptr;
ap._Ptr=NULL;
}
return *this;
}
T& operator*()
{
return *_Ptr;
}
T* operator->()
{
return _Ptr;
}
private:
T* _Ptr;
};
Second——>scoped ptr
scoped ptr与auto ptr类似,它实现的原理则是防拷贝,也就是它不能转移管理权,所以不能被赋值或者拷贝构造。那么,我们可以将拷贝构造和赋值运算符重载函数只声明不实现,并将其声明为保护,那么也就防止了别人在类外实现它。
代码实现:
template <class T>
class ScopedPtr
{
public:
ScopedPtr(T* Ptr)
:_Ptr(Ptr)
{}
~ScopedPtr()
{
if(_Ptr!=NULL)
{
delete _Ptr;
}
}
T& operator*()
{
return *_Ptr;
}
T* operator->()
{
return _Ptr;
}
protected:
T* _Ptr;
ScopedPtr(ScopedPtr<T>& sp);
ScopedPtr<T>& operator=(ScopedPtr<T>& sp);
};
Third——>shared ptr
shared ptr顾名思义就是共享,所以也就是说多个指针可以指向同一个内存,它所采用的是引用计数的原理,也就是引进了一个计数器shared_count,用来表示当前有多少个智能指针对象共享指针指向的内存。因此shared_ptr可以做为STL容器的元素。析构函数中不是直接释放指针对应的内块,shared_count大于1则不释放内存只是将引用计数减1,只是计数等于1时释放内存。这样避免了一块内存被多次析构的问题。
代码实现:
template <class T>
class SharedPtr
{
public:
SharedPtr(T* Ptr)
:_Ptr(Ptr)
,_Pcount(new long(1))
{}
~SharedPtr()
{
_Release();
}
SharedPtr(SharedPtr<T>& sp)
:_Ptr(sp._Ptr)
,_Pcount(sp._Pcount)
{
++(*_Pcount);
}
SharedPtr<T>& operator=(SharedPtr<T>& sp)
{
if(&sp!=this)
{
_Release();
_Ptr=sp._Ptr;
_Pcount=sp._Pcount;
++(*_Pcount);
}
}
T& operator*()
{
return *_Ptr;
}
T* operator->()
{
return _Ptr;
}
long UseCount()
{
return *_Pcount;
}
T* GetPtr()
{
return _Ptr;
}
protected:
T* _Ptr;
long *_Pcount;
void _Release()
{
if(--(*_Pcount)==0)
{
delete _Ptr;
delete _Pcount;
}
}
};
由上述代码可知,我们在拷贝和赋值也会将引用计数进行递增,而实现也只是一般的复制。
动态对象的正确释放是编程中最容易出错的地方,利用智能指针可以更安全的使用动态对象,使得我们的程序更高效、安全。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。