#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();
为什么这一行留给程序员调用而不是放入弱指针设计本身,因为每当共享指针共享值给弱指针引用计数必须自动递增,对吗?不需要调用此行的极端情况是什么,因此不应增加引用计数。
你所描述的,通过引用计数的自动递增和递减,会将本应是弱指针的东西变成共享指针。
每次我们复制或分配共享指针时,共享指针都会自动增加引用计数(并在共享指针被销毁时再次减少它)。
但是弱指针是为了处理结构中的循环之类的事情:
如果我们在这里使用共享指针,每个节点都有一个对它的引用,所以不会删除任何节点,即使(例如)我们没有其他指针指向这些节点中的任何一个,所以它们实际上都是无法访问。所以,它们的内存都会泄漏。
弱指针解决了这个问题:
这里虚线表示的“向后”指针是弱指针。仅仅是它存在的事实 not 将引用计数增加到
A
。所以,如果我们没有其他指向这些节点的指针,它们的引用计数将全部降为 0,并且它们将全部被删除。
但是,如果/当我们决定需要查看
C
指向的内容时,我们将该弱指针转换为共享指针。这会将引用计数增加到A
。然后当我们使用完该链接时,我们处理共享指针,减少 A
的引用计数。
但这里的整个想法是,从
C
到 A
的指针将 仅 确保当我们实际使用该链接时,
A
仍然可以访问。如果对 A
的所有其他引用都被销毁,并且我们当前没有使用从 C
到 A
的链接,那么所有节点(A
、B
和 C
)都应该被销毁.
为了获得这种行为,我们需要做一些明确指定我们何时使用从
C
到 A
的链接。