智能指针
当一个函数中出现大量的return,那么在每一次return前都要将new出来的变量进行delete,这种操作非常麻烦而且容易出错,还容易造成内存碎片,智能指针就是用来解决这种问题的。
智能指针是一个类模板,主要功能是假装自己是一个指针,重载解引用和 ->,通过析构函数自动释放指针,解决上面的问题。
智能指针就是更加方便,安全的使用临时new出来的变量或对象的。
1、auto_ptr C++98支持,已经废止,尽量不要使用
2、unique_ptr
3、shared_ptr
三种指针在拷贝时的区别:
1、auto_ptr 当对象拷贝或者赋值后,原来的对象就悬空了
2、unique_ptr 不允许进行拷贝和赋值
3、shared_ptr 随意拷贝。
shared_ptr的原理:
是通过引用计数的方式来实现多个shared_ptr对象之间共享资源。
1、shared_ptr在其内部,给每个资源都维护了着一份计数,用来记录该份资源被几个对象共享。
2、在对象被销毁时(也就是析构函数调用),就说明自己不使用该资源了,对象的引用计数减一。
3、如果引用计数是0,就说明自己是最后一个使用该资源的对象,必须释放该资源;
4、如果不是0,就说明除了自己还有其他对象在使用该份资源,不能释放该资源,否则其他对象就成野指针了。
weak_ptr: 解决循环引用的问题:
智能指针指向的类型里,包含同样类型的智能指针(类似链表),在这种情况,如果像链表那样赋值,就会产生循环引用。
特点:什么都没有,只能保存指针
删除器:
构造的第二个参数可以传一个仿函数,代表析构的方式
智能指针的实现(实现解引用和->的重载)
template<class T>
class SmartPtr{
T m_ptr;
public:
SmartPtr(T *m_ptr = nullptr) :
m_ptr(ptr)
{
}
~SmartPtr(){
if (m_ptr){
delete m_ptr;
}
}
T & operator *(){
return *m_ptr;
}
T * operator ->(){
return m_ptr;
}
T & operator [](int i){
return m_ptr[i];
}
};