c++day7

一.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)

将弱指针转换成共享指针

if ( wpa . expired ()) // 判断当前弱指针指向的对象是否被释放,弱被释放,返回 true, 否则返
false
{
cout << "wpa poniter class is free" << endl ;
}
ret

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值