c++ - 弱指针库实现C++

标签 c++ shared-ptr lib weak-ptr refcounting

#include <iostream>
using namespace std;

class Printer
{
    weak_ptr<int> m_Value{};
public:
    void SetValue(weak_ptr<int> p)
    {
        m_Value = p;
    }

    void Print() const
    {
        cout << "ref count = " << m_Value.use_count() << endl;
        if (m_Value.expired())
        {
            cout << "resource expired";
            return;
        }
        auto sp = m_Value.lock();
        cout << "sp ref count = " << sp.use_count() << endl;

        cout << "Value is = " << *sp << endl;
    }
};

int main()
{
    Printer prn;
    int num;
    cout << "Enter num = ";
    cin >> num;
    shared_ptr<int> p{new int(num)};
    prn.SetValue(p);
    if (*p > 10)
    {
        p = nullptr;
    }
    prn.Print();
}

我正在学习 C++ 11/14/17 概念,并且了解了这个弱指针概念。上面的代码是我学习和实现并理解的示例,并且上面的代码没有错误。但我对这个弱指针的库设计存有疑问。

auto sp = m_Value.lock();

为什么这一行留给程序员调用,而不是放入弱指针设计本身,因为每当共享指针与弱指针共享值时,引用计数就必须自动递增,对吧?不需要调用此行的极端情况是什么,因此不应增加引用计数。

最佳答案

您所描述的,通过自动递增和递减引用计数,会将原本应该是弱指针的内容变成共享指针。

每次我们复制或分配共享指针时,共享指针都会自动增加引用计数(并在共享指针被销毁时再次减少引用计数)。

但是弱指针旨在处理结构中的循环之类的事情:

enter image description here

如果我们在这里使用共享指针,每个节点都有一个对其的引用,因此任何节点都不会被删除,即使(例如)我们没有其他指针指向这些节点中的任何一个,所以它们是一切实际上都无法访问。因此,它们所有人的内存都会泄漏。

弱指针解决了这个问题:

enter image description here

这里虚线表示的“向后”指针是弱指针。事实上,它的存在不会将引用计数增加到A。因此,如果我们没有其他指针指向这些节点,它们的引用计数将全部降至 0,并且它们将全部被删除。

但是,如果/当我们决定需要查看 C 指向的内容时,我们会将该弱指针转换为共享指针。这会将引用计数增加到 A。然后,当我们使用完该链接后,我们将处理共享指针,从而减少 A 的引用计数。

但这里的整个想法是,从 CA 的指针将确保 A 仍然存在当我们实际使用该链接时可以访问。如果对 A 的所有其他引用都被销毁,并且我们当前没有使用从 CA 的链接,则所有节点 ( ABC)应被销毁。

要获得该行为,我们需要执行一些操作来明确指定何时使用从 C 返回到 A 的链接。

关于c++ - 弱指针库实现C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75646623/

相关文章:

c++ - c++编译时的错误

c++ - 与类型同名的变量 - 哪个编译器是正确的?

c++ - 我是否误解了这个默认参数 shared_ptr 的范围?

c++ - 从shared_ptr推导出weak_ptr参数

C++11 Shared_ptr 和 pthread

c++ - 在没有预编译器的情况下生成 C++ 类

java - jar 内的 NoClassDefFoundError

c++ - 两个可以相互扩展的库

c++ - 如果我发布一个使用 IPP 库的 DLL,我是否也应该发布 IPP DLL?

C++ 库,静态和动态