c++11智能指针
在c+ +11中,引入了智能指针。主要有:unique_ptr,shared_ptr,weak_ptr.
这3种指针组件就是采用了boost里的智能指针方案。我们看一下它和c++11智能指针的功能:
std | 功能说明 |
---|---|
unique_ptr | 独占指针对象,防拷贝 |
shared_ptr | 引用计数,支持拷贝,支持定制删除器 |
weak_ptr | 协助shared_ptr |
上面三个和auto_ptr都在头文件里
#include<iostream>
#include<memory>
using namespace std;
#include<string>
using namespace std;
int main()
{
unique_ptr<int> up1(new int(11));
//unique_ptr<int> up2 = up1;//编译会出错[1]
cout << *up1 << endl;
unique_ptr<int> up3 = move(up1);//[2]
cout << *up3 << endl;
if(up1)
cout << *up1 << endl;
up3.reset();//[3]
up1.reset();
shared_ptr<string> sp1(make_shared<string>("hehe"));
shared_ptr<string> sp2 = sp1;
cout <<"*sp1"<< *sp1 << endl;
cout <<"*sp2"<< *sp2 << endl;
sp1.reset();
cout << "*sp2" << *sp2 << endl;
weak_ptr<string> wp = sp2;//[4]
cout << "*wp.lock():" << *wp.lock() << endl;
sp2.reset();
// cout << "*wp.lock():" << *wp.lock() << endl;//运行时错误
system("pause");
return 0;
}
运行结果:
11
11
*sp1hehe
*sp2hehe
*sp2hehe
*wp.lock() :hehe
总结:
1:unique_ptr是禁止赋值赋值的,始终保持一个unique_ptr管理一个对象
2:unique_ptr虽然不能赋值,但可以通过move()函数转移对象所有权,并且之前up1无效
3:reset()方法可以提前释放指针
shared_ptr与weak_ptr
由于shared_ptr使用引用计数,所以有循环计数的问题。为了打破循环,可以使用weak_ptr
,顾名思义,weak_ptr是一个弱引用,只引用,不计数。如果一块内存被shared_ptr与weak_ptr同时引用,当所有shared_ptr析构之后,不管有没有weak_ptr引用,该内存都会被释放。所以weak_ptr不保证它指向的内存一定是有效的,在使用之前需检查。
示例:
void Test()
{
shared_ptr<int> sp1(new int(5));
weak_ptr<int> wp1 = sp1;//还是只有sp1有所有权
{
shared_ptr<int> sp2 = wp1.lock();//sp1和sp2都有所有权
if (sp2)
{
cout <<"*sp2"<< *sp2 << endl;
}
}//sp2析构了,现在只有sp1有所有权
sp1.reset();//释放内存
shared_ptr<int> sp3 = wp1.lock();//因为内存已经被释放了,所以sp3是空指针
if (sp3)
{
cout <<"*sp3"<< *sp3 << endl;
}
}
总结
智能指针的设计思想就是RAII,也称为“资源获取就是初始化”,是c++等编程语言常用的管理资源、避免内存泄露的方法。它保证在任何情况下,使用对象时先构造对象,最后析构对象。