美文网首页
c++智能指针之shared_ptr

c++智能指针之shared_ptr

作者: 小阿牛的爸爸 | 来源:发表于2021-11-19 20:49 被阅读0次

    1 shared_ptr指针初始化

    1.1 通过一个已存在的普通指针进行初始化

    此种方法不建议,因为如果原始指针指向的空间被释放掉的话,同时会引起指针指针的异常

    // 定义普通指针p
    int* p = new int (10);
    // 通过普通指针创建智能指针a
    std::shared_ptr<int> a (p);
    // 如果此时删除原始指针p,后面智能指针a则会出现异常
    delete p;
    

    1.2 通过make_shared进行初始化

    std::shared_ptr<int> a = std::make_shared<int>(10);
    std::cout << *a << "\n";
    

    1.3 通过另一个智能指针进行初始化

    这种情况下多用于参数传递

    // Teacher类中有一个成员变量std_,其类型是智能指针。
    class Teacher
    {
    public:
        Teacher();
        void setStu(const std::shared_ptr<Student> &stu);
        
    private:
        std::shared_ptr<Student> stu_ = nullptr;
    };
    
    

    通过=运算符,对一个智能指针进行赋值。两者指向同一个智能指针对象,赋值后,智能指针的使用次数+1。

    void Teacher::setStu(const std::shared_ptr<Student> &stu)
    {
        std::cout << stu.use_count() << std::endl;
        stu_ = stu;
        std::cout << stu.use_count() << std::endl;
    }
    

    2 获取shared_ptr管理的原始指针

    shared_ptr提供了get方法来获取其管理的指针

    std::shared_ptr<int> b = std::make_shared<int>(10);
    int* bp = b.get();
    // 打印10
    std::cout << *bp << "\n";
    

    注意:
    其实b.get()和b指向的是同一个地址,因此对其做取值得到的结果也相同

    std::shared_ptr<int> b = std::make_shared<int>(10);
    // 下面两行都打印0x1f10f64
    std::cout << b.get() << "\n";
    std::cout << b << "\n";
    // 下面两行都打印10
    std::cout << *b.get() << "\n";
    std::cout << *b << "\n";
    

    相关文章

      网友评论

          本文标题:c++智能指针之shared_ptr

          本文链接:https://www.haomeiwen.com/subject/pueutrtx.html