背景
一般情况下内存空间分为下面几个部分:
- 堆:这一部分一般是暴露给程序员,程序员可以通过new来申请底层的空间的。堆的空间一般是通过new来申请的。堆上面的空间会比较大,但是在申请的过程中可能会出现碎片的问题。
- 栈:这一部分是留给程序的,一般情况下局部变量会放在这一部分空间。堆的空间一般是通过堆帧来进行管理的,这一部分的空间比较小。
- 数据区:放被初始化的局部变量、全局变量等。
这里就会发生一个问题,就是程序员在写程序的过程中选择使用new进行堆空间的申请,返回了一个指针,但是这个指针在程序返回的时候,没有调用delete掉,这部分的指针就没办法被释放掉,这就导致了内存泄漏。因此在这种情况下,为了比较好的管理内存,智能指针被提出来了。智能指针主要是为了管理在堆上分配的内存。将普通的指针封装成一个栈对象。当对象的生命周期结束之后,会在析构函数中释放掉申请的内存,防止内存泄漏。
智能指针的思想就是利用c++的封装思想,也就是我把new申请空间的指针作为类的对象封装起来,形成一个类。类对象的管理是在栈上面进行的,那么当程序退出的时候,栈上的对象会被自动析构,这样就不会造成内存泄漏。
分类
unique_ptr
这个指针最大的特点就是同一时间只能有一个对象享有所有权。只允许基础指针的一个所有者。可以移到新所有者,但不会复制或共享。 使用的过程如下所示:
class