出现的原因
智能指针的出现是为了解决原生指针的安全问题,比如悬挂指针、多次释放、野指针等问题
语法
std::unique_ptr<类型>变量名 { }
std::unique_ptr <int>ptr {new int(5)};
这个例子中,不能用ptr【0】这种方式来访问,而原生数组可以,这就是智能指针的安全性
创建数组的内存
std::unique_ptr <int[] >ptr {new int[5]{1,2,3,4,5}};
这个例子中,就只能用ptr【0】的方式访问,而不能用*ptr的方式
特点
unique_ptr:唯一指针
一个内存地址只能有一个指向
std::unique_ptr <int>ptrA {new int(5)};
std::unique_ptr <int>ptrB {};
ptrB=ptrA
这三行代码不能通过编译,因为它是唯一指针
C++14新语法
用std::make_unique<int>进行赋值
std::unique_ptr<int> ptrA {std::make_unique<int>(5)};
std::unique_ptr<int[]> ptrA {std::make_unique<int[]>(5)};
第二行的5表示数组元素有5个
reset方法
ptr.reset();
将指针赋值为nullptr,同时将内存清空
get方法
ptrA.get();
返回ptr的值
release()
ptr.release();
不会释放内存空间,只是将指针设置为nullptr,即返回ptr的值,并将其赋值为0
转移
智能指针不能复制,但是可以转移
语法
转移后的指针变量=std::move(转移前的指针变量)
转移后,原先的指针变量变成nullptr,因为要保证智能指针的唯一性
std::unique_ptr <int>ptrA {std::make_uniuqe<int>(5)};
std::uniuqe_ptr <int>ptrB;
ptrB=std::move(ptrA);
此时,ptrA变成nullptr
代码实战
int* p;
{
int a=new int[50];
p=a;
a[2]=255;
}
std::cout <<p[2];
这里,变量a遇到括号就结束了生命周期,但是内存空间还在,p[2]还是可以访问,这就是野指针
这里就要用到智能指针来处理
int* p;
{
std::unique_ptr<int[]>a{std::make_unique<int[]>(50)};
p=a;
a[2]=255;
}
std::cout <<p[2];
这里,不仅将a[2]内存空间释放掉了,还讲p设置为nullptr,这就是智能指针
int* p;
{
int* a=new int[5];
p=a;
a[2]=255;
delete[] a;
}
std::cout <<p[2];
这里清空了a的内存,但是p却在这之前指向了.a,这就是释放了内存,但没有清空指针,就会出错