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