shared_ptr 其实就是对资源做引用计数——当引用计数为 0 的时候,自动释放资源。
常用操作
shared_ptr sp | 空智能指针,可以指向类型为T的对象 |
p->f() | 等价于(*p).f() |
p.get() | 返回一个p所指向的对象的一个普通指针 |
make_shared(args) | 返回一个指向T类型的智能指针,args为初始化 |
shared_ptrp(q) | p是q的一个指针,他们指向一个对象,所以该对象的计数器会加一 |
p=q | 将p所指的对象改为q指向的对象,因此原先p的计数减一,q的加一 |
p.unique() | 若其计数器为1,返回真 |
p.use_count() | 返回计数 |
下面写几个程序帮助理解
#include<iostream>
#include<memory>
#include<memory.h>
using namespace std;
int main()
{
shared_ptr<int> p = make_shared<int>(100);
cout << p.use_count() << endl; //此时计数器为1
{
shared_ptr<int>q(p);
cout << p.use_count() << endl; //p和q指向同一资源,计数器为2
}
cout << p.use_count() << endl; //q释放了,所以计数器为1
}
#include<iostream>
#include<memory>
#include<memory.h>
using namespace std;
void f(shared_ptr<int>q)
{
shared_ptr<int>p(q);
cout<<"f: "<<p.use_count()<<endl;//由于传参的时候会有一个对指针的拷贝,再加上这个新构造的指针,就有三个
return;
}
shared_ptr<int> f1(shared_ptr<int>q)
{
shared_ptr<int>p(q);
cout<<"f1: "<<p.use_count()<<endl;
return p;
}
int main()
{
int a=1;
shared_ptr<int>p=make_shared<int>(a);
cout<<p.use_count()<<endl;
f(p);
cout<<p.use_count()<<endl; //f中的q在除了作用域以后被释放,参数也被释放,所以又只有1
shared_ptr<int>q=f1(p);
cout<<p.use_count()<<endl;//return的时候增加了一个拷贝 所以是2
system("pause");
}
注意:不要轻易把普通指针和智能指针混用!因为普通指针指向资源不会增加向对应的智能指针的计数器。
#include<iostream>
#include<memory>
#include<memory.h>
using namespace std;
int main()
{
int *a=new int(3);
cout<<(*a)<<endl; //值为3
{
shared_ptr<int> p(a);
}
cout<<(*a)<<endl; //值为乱码,因为上面的p在离开作用域后被释放,其指向的3计数器降为0,所以也会被释放,此时a在无意间变成了悬挂的指针!
system("pause");
}