为什么使用智能指针(什么是智能指针)?
使用指针申请的空间,很可能在函数结束时忘记释放,或还没有执行到释放空间的代码就已经跳出函数,造成内存泄漏。使用智能指针可以很大程度上的避免这个问题,
智能指针定义了类似指针的对象,可以将new获得的地址赋给这种对象,管理在堆上分配的内存;当智能指针过期时,其析构函数将使用delete来释放内存,这些内存将自动被释放。所以智能指针的作用原理就是在函数结束时自动释放内存空间,不需要手动释放内存空间。
使用时需包含memory头文件,在std命名空间中。
智能指针有哪些?
C++中有四个智能指针:Auto_ptr 、unique_ptr 、shared_ptr、 weak_ptr,其中后三个是c++11支持的,auto_ptr已经被c++11弃用。
Auto_ptr、unique_ptr的策略是建立所有权的概念,对于特定的对象,只能有一个智能指针可拥有它,这样只有拥有对象的智能指针的构造函数会删除该对象,然后,让赋值操作转让所有权。
Auto_ptr
当尝试将一个auto_ptr指针p1赋值给另一个p2时,p2剥夺了p1的所有权,当程序访问p1时会报错,所以auto_ptr存在潜在的内存崩溃问题。
unique_ptr
unique_ptr比auto_ptr更严格,如果程序试图将一个unique_ptr指针p1赋给另一个p2时,如果p1是个临时的右值,很快被销毁,编译器允许这样做,如果p1将存在一段时间,编译器将禁止这样做。
shared_ptr
Shared_ptr实现共享式拥有概念最常用的智能指针,它采用引用计数的方法,记录当前内存资源被多少个智能指针引用。该引用计数的内存在堆上分配,当新增一个指针指向内存时,引用计数加一,当指针过期时,引用计数减一,只有引用计数为0时,智能指针才会释放内存资源。
Shared_ptr可能会带来内存泄漏:当两个对象相互使用一个shared_ptr成员变量指向对方,会造成循环引用,从而导致内存泄漏。(如何解决?解决方法:weak_ptr。)代码举例如下:
#include <iostream>
#include<memory>
using namespace std