智能指针shard_ptr

本文介绍了C++中std::shared_ptr的使用,包括通过make_shared初始化,指定删除器,以及使用enable_shared_from_this来安全地获取对象的shared_ptr。同时强调了使用中的常见问题,如避免原始指针初始化多个shared_ptr,防止循环引用等。
摘要由CSDN通过智能技术生成

#include <memory>

struct A
{
    std::shared_ptr<A> GetSelf()
    {
        return std::shared_ptr<A>(this);
    }
};

//自定义删除器
void DeleteIntPtr(int* p)
{
    delete p;
}
//自我封装一个make_shard_array让shard_ptr支持数组
template<typename T>
std::shared_ptr<T> make_shard_array(size_t size)
{
    return std::shared_ptr<T>(new T[size], std::default_delete<T[]>);
}
//通过派生enable_shared_from_this,并且使用shared_from_this()方法来返回
//this指针
//原因是:enable_shared_from_this类中有一个weak_ptr,这个weak_ptr是用来观测this指针的,调用shared_from_this()
//方法时,内部会调用weak_ptr的lock方法。
class B :public std::enable_shared_from_this<B>
{
public:
    std::shared_ptr<B> GetSelf() 
    { 
        return shared_from_this();
    }
};

int main()
{
    //1.初始化 使用make_shared<T>或者reset方法初始化shared_ptr指针
    std::shared_ptr<int> p(new int(1));
    std::shared_ptr<int> p2 = p;
    std::shared_ptr<int> ptr;
    ptr.reset(new int(1));
    //优先使用make_shared来构造智能指针
    //2.不能直接将一个裸指针直接赋值给一个智能指针
    //std::shared_ptr<int> p = new int(1);

    //3.获取原始指针
    //std::shared_ptr<int> ptr(new int(1));
    //int* p = ptr.get();

    //4.指定删除器 
    //std::shared_ptr<int> p(new int, DeleteIntPtr);
    //删除器也可以是一个lambda
    //std::shared_ptr<int> p(new int, [](int* p) {delete p; });
    /*当shard_ptr管理动态数组时,需要指定删除器,shard_ptr的默认删除器不支持数组对象*/

    //使用shard_ptr需要注意的问题:
    //1.不要使用原始指针初始化多个shared_ptr
    //int* ptr = new int;
    //std::shared_ptr<int> p1(ptr);
    //std::shared_ptr<int> p2(ptr);//p1和p2的use_count返回值仍然是1

    //2 通过shared_from_this()返回this指针,不要将this指针作为shared_ptr返回出来
    //原因是用同一个this构造了两个智能指针,它们之间没有关系
    //正确的做法是:让目标类通过派生std::enable_shared_from_this<T>类,然后使用
    //shared_from_this来返回this的shared_ptr


    //3.避免循环引用

    std::shared_ptr<B> sp1(new B);
    std::shared_ptr<B> sp2 = sp1->GetSelf();

    return 0;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值