一.智能指针概念
智能指针上并不是指针,而是封装了指针的类,当我们在堆区开辟内存时,为了避免内存泄漏的情况需要手动删除该区内存,而智能指针通过对于指针的封装使得我们无需手动管理内存,而是会在出作用域时自动释放那部分内存空间。
二. unique_ptr
unique_ptr是不可以被共享的智能指针,意思是一旦一个unique_ptr被创建,它不能赋值给另一个unique_ptr,因为在其底层把删除了拷贝构造函数,这么做的目的是防止出现野指针,提高安全性。
举个例子:两个unique_ptr维护同一部分内存,其中一个unique_ptr出作用域被自动删除,内存被释放,而此时另一个unique_ptr指向的还是那部分内存,即其指向了一部分不可用的内存区域,会导致野指针的出现。
我们可以用以下方法创建unique_ptr
unique_ptr<Entity> E(new Entity());
unique_ptr<Entity> E = make_unique<Entity>();
实际使用中,因为考虑安全性,防止new操作符异常,更推荐第二种写法
三. shared_ptr
shared_ptr与unique_ptr有所不同,它可以被共享,即可以赋值给其它同类,它会额外申请一部分内存,用来存储叫做控制块的数据结构,它记录着有多少个引用计数,即有多少指针与它共享同一块内存,发生拷贝,计数加一,析构发生, 计数减一,当计数器等于0的时候,就把对象析构掉。
shared_ptr<Entity> E(new Entity());
shared_ptr<Entity> E = make_shared<Entity>();
由于make_shared效率更快,且安全性更高,实际使用建议用此方法
四. weak_ptr
weak_ptr 是为了shared_ptr而生的智能指针,可以被shared_ptr赋值,但它不增加引用计数,但也可以访问修改资源。