弱指针库实现C++

问题描述 投票:0回答:1
#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();

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

c++ shared-ptr lib weak-ptr refcounting
1个回答
0
投票

你所描述的,通过引用计数的自动递增和递减,会将本应是弱指针的东西变成共享指针。

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

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

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

弱指针解决了这个问题:

这里虚线表示的“向后”指针是弱指针。仅仅是它存在的事实 not 将引用计数增加到

A
。所以,如果我们没有其他指向这些节点的指针,它们的引用计数将全部降为 0,并且它们将全部被删除。

但是,如果/当我们决定需要查看

C
指向的内容时,我们将该弱指针转换为共享指针。这会将引用计数增加到
A
。然后当我们使用完该链接时,我们处理共享指针,减少
A
的引用计数。

但这里的整个想法是,从

C
A
的指针将 确保当我们实际
使用
该链接时,A 仍然可以访问。如果对
A
的所有其他引用都被销毁,并且我们当前没有使用从
C
A
的链接,那么所有节点(
A
B
C
)都应该被销毁.

为了获得这种行为,我们需要做一些明确指定我们何时使用从

C
A
的链接。

© www.soinside.com 2019 - 2024. All rights reserved.