美文网首页
c++ 标准中的弱引用

c++ 标准中的弱引用

作者: Little熊猫 | 来源:发表于2018-09-10 14:35 被阅读0次

一 弱指针使用

先看一个例子,没有弱智指针的情况下的嵌套引用

#include <iostream>
#include <memory> // for std::shared_ptr
#include <string>
 
class Person
{
    std::string m_name;
    std::shared_ptr<Person> m_partner; // initially created empty
 
public:
        
    Person(const std::string &name): m_name(name)
    { 
        std::cout << m_name << " created\n";
    }
    ~Person()
    {
        std::cout << m_name << " destroyed\n";
    }
 
    friend bool partnerUp(std::shared_ptr<Person> &p1, std::shared_ptr<Person> &p2)
    {
        if (!p1 || !p2)
            return false;
 
        p1->m_partner = p2;
        p2->m_partner = p1;
 
        std::cout << p1->m_name << " is now partnered with " << p2->m_name << "\n";
 
        return true;
    }
};
 
int main()
{
    auto lucy = std::make_shared<Person>("Lucy"); // create a Person named "Lucy"
    auto ricky = std::make_shared<Person>("Ricky"); // create a Person named "Ricky"
 
    partnerUp(lucy, ricky); // Make "Lucy" point to "Ricky" and vice-versa
 
    return 0;
}

结果是,在嵌套引用的情况下,无法通过智能指针进行回收资源

Lucy created
Ricky created
Lucy is now partnered with Ricky

弱指针是专门针对这种循环应用设计的,使用弱指针后:

#include <iostream>
#include <memory> // for std::shared_ptr and std::weak_ptr
#include <string>
 
class Person
{
    std::string m_name;
    std::weak_ptr<Person> m_partner; // note: This is now a std::weak_ptr
 
public:
        
    Person(const std::string &name): m_name(name)
    { 
        std::cout << m_name << " created\n";
    }
    ~Person()
    {
        std::cout << m_name << " destroyed\n";
    }
 
    friend bool partnerUp(std::shared_ptr<Person> &p1, std::shared_ptr<Person> &p2)
    {
        if (!p1 || !p2)
            return false;
 
        p1->m_partner = p2;
        p2->m_partner = p1;
 
        std::cout << p1->m_name << " is now partnered with " << p2->m_name << "\n";
 
        return true;
    }
};
 
int main()
{
    auto lucy = std::make_shared<Person>("Lucy");
    auto ricky = std::make_shared<Person>("Ricky");
 
    partnerUp(lucy, ricky);
 
    return 0;
}

输出

Lucy created
Ricky created
Lucy is now partnered with Ricky
Ricky destroyed
Lucy destroyed

二 弱指针转换

通过std::weak_ptr的lock接口可以将其转换成std::shared_ptr

#include <iostream>
#include <memory> // for std::shared_ptr and std::weak_ptr
#include <string>
 
class Person
{
    std::string m_name;
    std::weak_ptr<Person> m_partner; // note: This is now a std::weak_ptr
 
public:
 
    Person(const std::string &name) : m_name(name)
    {
        std::cout << m_name << " created\n";
    }
    ~Person()
    {
        std::cout << m_name << " destroyed\n";
    }
 
    friend bool partnerUp(std::shared_ptr<Person> &p1, std::shared_ptr<Person> &p2)
    {
        if (!p1 || !p2)
            return false;
 
        p1->m_partner = p2;
        p2->m_partner = p1;
 
        std::cout << p1->m_name << " is now partnered with " << p2->m_name << "\n";
 
        return true;
    }
 
    const std::shared_ptr<Person> getPartner() const { return m_partner.lock(); } // use lock() to convert weak_ptr to shared_ptr
    const std::string& getName() const { return m_name; }
};
 
int main()
{
    auto lucy = std::make_shared<Person>("Lucy");
    auto ricky = std::make_shared<Person>("Ricky");
 
    partnerUp(lucy, ricky);
 
    auto partner = ricky->getPartner(); // get shared_ptr to Ricky's partner
    std::cout << ricky->getName() << "'s partner is: " << partner->getName() << '\n';
 
    return 0;
}

输出:

Lucy created
Ricky created
Lucy is now partnered with Ricky
Ricky's partner is: Lucy
Ricky destroyed
Lucy destroyed

三 weak pointer使用
1) 嵌套引用场景
2) weakpointer 转换为shared_pointer

相关文章

  • c++ 标准中的弱引用

    一 弱指针使用 先看一个例子,没有弱智指针的情况下的嵌套引用 结果是,在嵌套引用的情况下,无法通过智能指针进行回收...

  • Weak Reference Soft Reference Ph

    JAVA 中的引用 JAVA 中存在4种引用,由强到弱依次是强引用、软引用、弱引用、虚引用。 强引用(Strong...

  • 深入理解Java弱引用

    Java中的引用类型 Java中存在四种引用,它们由强到弱依次是:强引用、软引用、弱引用、虚引用。下面我们简单介绍...

  • iOS开发中常用的宏

    1,获取屏幕的大小,宽度和高度 用法: 2,弱引用/强引用 弱引用和强引用主要用在Block中,防止循环引用,导致...

  • C++基础

    C++ 值传递、指针传递、引用传递详解C++中引用传递与指针传递区别 引用传递和指针传递的区别 引用的规则:(1)...

  • ios中的强引用,弱引用

    强引用一个弱引用的对象 依旧是强引用 例如,数组, 字典。 想要变成弱引用可以使用NSValue的2个方法val...

  • iOS--强引用,弱引用 及strong, weak,retai

    强引用和弱引用:特点:在强引用中,有时会出现循环引用的情况,这时就需要弱引用来帮忙(__weak)。强引用持有对象...

  • c++一些基本的命令

    安装c++编译软件包:sudo apt-get install g++ 命名空间 强转打印 标准输入 引用 引用的...

  • c++构造函数

    简介 目前C++标准已经发展到C++17,随着右值引用等相关内容的加入,C++中的构造函数也逐渐丰富,在开始后面的...

  • 指针和引用的区别

    参照lyd_253261362的专栏的文章详细介绍=====c++中的引用与指针的区别 c++中的引用与指针的区别...

网友评论

      本文标题:c++ 标准中的弱引用

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