智能指针
- 智能指针是什么
- auto_ptr
- 智能指针使用注意事项
- unique_ptr
- shared_ptr
- 如何选择智能指针
智能指针是什么
智能指针是指:行为类似于指针的类对象;
核心思想:它是一个类对象,对象过期时,对象的析构函数会自动被调用删除指针指向的内存;
auto_ptr
以auto_ptr为例使用智能指针,其余两个(实际是三个)智能指针使用方法与auto_ptr类似。
#include <iostream>
#include <string>
//需要包含下面头文件
#include <memory>
using namespace std;
auto_ptr<double> pd(new double(1.0));
auto_ptr<string> pa(new string("abcde"));
//应避免以下的行为
//后面的括号中只能是动态申请的地址
//否则在执行析构函数时会出错(释放非堆空间)
string s("abcde");
auto_ptr<string> pc(&s);
智能指针括号中,只能是动态分配的地址;否则析构时会释放非堆空间,导致程序崩溃。
智能指针使用注意事项
当两个智能指针指向同一个地址时,执行两次析构函数,会导致释放过地址再次被释放,致使程序崩溃。
解决办法:
- 重载赋值运算符,进行深拷贝;
- 建立所有权概念;若a = b,则b丧失对地址的所有权;
- 创建更智能的指针,跟踪引用指针的次数并记录,仅当此时为1时析构才释放指针空间;
auto_ptr、unique_ptr都是采用所有权概念;
shared_ptr是采用更智能方式,记录次数;
unique_ptr
使用方法与auto_ptr相同,但是需要注意,
- unique_ptr重载了new[] / delete[],而auto不能申请动态数组;
- 当 p2 = p1所有权发生变更时,unique会报错(编译时错误优于运行时错误)
- 若将一个右值指针的所有权交割unique不会报错
shared_ptr
使用方法与auto_ptr相同,但是需要注意,它采用计数形式析构,只有最后一次析构才会释放空间;
选用哪个指针
- 程序若使用多个指针指向一个对象,则使用shared_ptr
- 否则,推荐使用unique_ptr