智能指针
将原生指针封装成对象,来解决堆上内存泄漏的问题。
- 为什么要使用智能指针:
智能指针的作用是管理一个指针,因为存在以下这种情况:申请的空间在函数结束时忘记释放,造成内存泄漏。使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个类,当超出了类的作用域是,类会自动调用析构函数,析构函数会自动释放资源。所以智能指针的作用原理就是在函数结束时自动释放内存空间,不需要手动释放内存空间。
当栈对象生存周期结束,智能指针会调用析构函数释放之前申请的内存,从而避免内存泄漏。
智能指针是类,一定要有operator*和operator->();*传回所指的对象,->调用对象的成员。
- C++里面的四个智能指针: auto_ptr, shared_ptr, weak_ptr, unique_ptr 其中后三个是c++11支持,并且第一个已经被11弃用。
-
auto_ptr:拥有严格对象所有权语义的智能指针;
shared_ptr:拥有共享对象所有权语义的智能指针;
weak_ptr:到 shared_ptr 所管理对象的弱引用;
unique_ptr:拥有独有对象所有权语义的智能指针。
- C++11常用的智能指针有shared_ptr,它采用计数的方法,记录当前内存被几个智能指针引用。计数内存在堆上分配。
当新增一个引用时,计数+1;失去一个引用,计数-1.
当引用为0,智能指针自动释放申请的内存资源。