C++智能指针----入门
Q1.什么是智能指针?
简单理解就是能够自动释放内存的"指针"
注意,这里说的是指针
,也就是普通指针,我们把它叫做原始指针
,这一点很重要。也就是说,你可以你完全可以将它当作原始指针使用(当然拷贝操作例外),因为它重载了*与->运算符。
- 智能指针离开作用域后会自动释放
Q2.智能指针有什么用,能解决什么问题?
它能帮助我们更有效、更安全的管理动态分配的内存,避免内存泄漏问题的发生。
Q3.智能指针
(1)智能指针的种类
1)、std::auto_ptr 已经被放弃
存在安全隐患
2)、独占指针:unique_ptr
- 独占内存控制权,不能拷贝,即不能进行(=)赋值操作,只能通过
move()
函数来移交控制权。
//此操作将内存控制权移交tPtr1,tPtr将被释放,指向
//unique_ptr<Test> tPtr1 = tPtr; //错误! 不能拷贝
unique_ptr<Test> tPtr1 = std::move(tPtr);
3)、共享指针:shared_ptr
- 共享指针,又称计数指针,可以被复制拷贝,每多一个拷贝的副本,计数器+1,当计数器为0时,自动释放该指针所托管的内存。
4)、unique_ptr 与 shared_ptr转换
- unique_ptr 可直接转换为shared_ptr
- shared_ptr不可转换为unique_ptr
5)、弱指针:weak_ptr
最重要的特性是:不享有内存释放的权限
*
(2)、创建方式
有三种创建方式,以unique_ptr为例,如下所示:
//方式1 【不推荐此方式】
Test ts = new Test();
unique_ptr<Test> tPtr(ts); //创建智能指针
delete ts;
ts = nullptr;
//方式二
unique_ptr<Test> tPtr(new Test()); //创建智能指针
//方式三 【推荐此方式,效率更高】
//创建智能指针,与普通指针new方法类似
//后面的() 为Test类的构造函数传参
unique_ptr<Test> tPtr = make_unique<Test>();
注意:独占指针的make_unique<>()是在c++14标准定义的,若编译时未指定使用c++14标准,将找不到此函数。
(3)、内部接口
reset()
:释放智能指针所托管的内存,并指向nullptr,他还有一个重载,参数为make_unique<>()。也就是释放原来的内存并托管新的内存get()
:返回所托管的原始指针,即:Test *ts = tPtr.get();release()
:释放对原始指针的托管,并将原始指针返回。这意味着这个被释放的原始指针将不会被自动释放,需要手动释放内存。
注意事项
- 最好不要将智能指针定义为指针
unique_ptr<Test> *tPtr = new unique_ptr<Test>(new Test());
- 智能指针的接口都是通过 (.)运算符调用,而智能指针所托管的指针通过(->)运算符调用。