一.make_shared
手动开辟智能指针
make_shared开辟智能指针
手动初始化和make_shared函数模板初始化有什么区别?
1.make_shared函数模板初始化开销小,效率高(数据和引用计数存在同一个空间)
2.构造函数初始化:数据和引用计数不再同一段空间,需要间接访问
二.use_count()
功能:返回有多少个智能指针指向某个对象(引用计数的个数)
用途:主要用于调试
三.unqiue
功能:是否该智能指针独占某个对象,独占返回true,否则返回false
四.reset()/reset(参数)
reset()功能:判断当前指针是否独享该对象,如果独享,则释放该对象,否则将该指针置为NULL,并将引用计数器减一。
reset(参数)功能:判断该指针是否独享该对象,如果独享,则释放该对象,并使该指针指向形参所对应的空间。
五.get()
功能:获取智能指针指向的对象,并对其操作
获取的是智能指针中的一个裸指针
六.删除器
功能:有些情况,默认删除器处理不了(shared_ptr 管理的动态数组)需要我们自己指定删除器,调用删除器函数释放空间。
七.lambda表达式
shared_ptr<A> pa(new A[3],[] A*a{
delete []a;
});
#include <iostream>
#include <memory>
#include <string>
using namespace std;
class A
{
public:
A()
{
cout << "A's create with no num" << endl;
}
A(int n)
{
m_a = n;
cout << "A's create with num" << endl;
}
~A()
{
cout << "A's destory" << endl;
}
public:
int m_a;
};
shared_ptr<A> test()
{
shared_ptr<A> tmp(new A);
return tmp;
}
void Func(shared_ptr<A> tmp)
{
cout << tmp->m_a << endl;
}
void Test(int *p)
{}
void Mydelete(A *pa)
{
delete []pa;
}
int main(int argc, const char *argv[])
{
shared_ptr<int> p(new int(5));
cout << *p << endl;
shared_ptr<string> p1(new string("helloworld"));
cout << *p1 << endl;
shared_ptr<A> p3(new A);
shared_ptr<A> res = test();
Func(p3);
shared_ptr<A> p4(p3);
shared_ptr<int> p5 = make_shared<int>(5);
cout << *p5 << endl;
shared_ptr<string> p6 = make_shared<string>("helloworld");
cout << *p6 << endl;
shared_ptr<A> a1 = make_shared<A>();
shared_ptr<A> a2(a1);
cout << a2.use_count() << endl;
cout << a1.use_count() << endl;
if(a1.unique())
{
cout << "a1 is unique ptr" << endl;
}
a1.reset();
if(a1 == nullptr)
{
cout << "a1 is nullptr" << endl;
}
cout << a2.use_count() << endl;
a1.reset(new A(10));
cout << a1->m_a << endl;
shared_ptr<int> pd = make_shared<int>(5);
Test(pd.get());
/* shared_ptr<A> pa(new A[3]);
shared_ptr<A[]> pa(new A[3]);
shared_ptr<A> pa(new A[3],Mydelete);
shared_ptr<A> pa(new A[3],defaule_delete<A[]>());
*/
return 0;
}
八.弱指针 weak_ptr
弱指针:不会控制对象的生命周期(不会改变对象的引用计数)
shared_ptr释放指向对象时,不会考虑weak_ptr是否指向该对象
weak_ptr不是独立指针,不能单独操作所指向的资源
weak_ptr一般用来辅助shared_ptr的使用(监视shared_ptr指向对象的生命周期)
weak_ptr和shared_ptr可以相互转化,shared_ptr可以直接赋值给weak_ptr
但是反过来不行,需要lock函数
调用lock函数来获取shared_ptr(如果对象已经释放,则返回一个空的shared_ptr)
将弱指针转换成共享指针