0.什么是智能指针?
智能指针是一种用来管理资源指针的特殊对象,对象中有一个成员变量用来保存动态创建的裸指针,通过重载operator->方法实现类似于裸指针的使用方式。
1.智能指针的作用是什么?
我们平时使用C++编写代码时,动态内存管理是我们时刻关注的重点。动态内存管理不好,容易出现下述三类问题:
1、野指针(空悬指针)
一些内存单元已经被释放,但是指向这些内存的指针还在使用,这些已经释放的内存有可能被系统重新分配给应用使用,此时再使用野指针,会造成无法预测的错误。
int *p = new int(10);
delete p;
// 释放后再次访问,无法预测结果
cout << *p << endl;
2、重复释放
程序试图释放已经被释放的资源,或者已经被重新分配的资源。
int *p = new int(10);
delete p;
// 重复释放,运行时报错
delete p;
3、内存泄露
不再使用的动态内存没有进行释放,便会造成内存泄露。如果程序多次存在内存泄露行为,会导致内存占用急剧增长,最终程序会因为无法申请到足够的空闲内存而异常退出。
void TestRelease()
{
int* p = new int(10);
// 未释放p
return;
}
这三类问题严重影响程序的高可用性。但是像JAVA这样的语言不会存在这样的问题,因为它们拥有比较好的内存回收机制,可以自动管理动态内存。为了保证资源可以正常释放,C++引入智能指针。智能指针的行为类似常规指针,重要的区别是它负责自动释放所指向的对象。
智能指针的主要思想是RAII思想,即”资源获取即初始化“:
(1)定义一个类来封装资源的分配和释放
(2)构造函数中完成资源的分配及初始化
(3)析构函数中完成资源的清理,可以保证资源的正确初始化和释放
(4)如果对象是在栈上创建的,那么RAII机制就会正常工作,当离开作用域对象会自动销毁,从而自动调用洗过后函数释放资源
2.C++11标准库中的智能指针
C++11中提供了三种智能指针来动态管理创建的对象。
1、std::shared_ptr<T>基于引用计数的智能指针,允许多个对象指向同一个资源;
2、std::unique_ptr<T>独占式智能指针,任何时刻一个资源只能由一个对象占用;
3、std::weak_ptr<T>是一种不控制所指向对象生存期的智能指针,它指向一个由shared_ptr管理的对象,将一个weak_ptr绑定到一个shared_ptr不会改变shared_ptr的引用计数。