为什么我们需要C++ 11中的weak_ptr?

Tus*_*hav 4 c++ c++11

我正在阅读Nicolai M. Josuttis撰写的"The C++ Standard Library"一书,以了解弱指针.作者提到了需要有一个weak_ptr的两个原因而我没有得到第二个原因.任何人都可以提供一个简单的解释以及以下原因的例子(引自书中):

当您明确要共享但不拥有对象时,会出现另一个示例.因此,您具有以下语义:对对象的引用的生命周期超过它引用的对象.在这里,shared_ptrs永远不会释放对象,普通指针可能不会注意到它们引用的对象不再有效,这会带来访问已发布数据的风险.

dav*_*bak 9

这句话的后半部分应该是明确的:如果一个指针是不是一个拥有指针则在可能被任何软件被删除指向的对象主人-然后你就会有标准的悬挂参考.

所以这个问题是:你有一些软件拥有的对象让其他软件可以访问它 - 但是其他软件不会共享所有权.因此所有者可以随时删除它,而其他软件需要知道它的指针不再有效.

也许一个例子会有所帮助:

你有一些软件正在观看一个摄像头,指出你的窗户指向一个喂鸟器,它正在识别喂食器上的鸟类,它来来去去.进给器中的每只鸟在到达进给器时都有一个由该软件创建的对象,当鸟飞走时该对象被删除.

与此同时,其他一些软件也进行了人口普查.它每隔10秒就从喂食器观察软件中抓取一个喂食器上的鸟类.每100秒,它会发出一个报告,说明在整个100秒内哪些鸟在喂食器上.

由于鸟类的数据很大,因此人口普查员不会复制数据.它只是每隔10秒从馈线观察者那里得到一组指针.

为了有必要使用弱指针,让我们说馈线观察者只提供指向过去十秒内到达的鸟类的指针,而不是那些曾经到过的指针.也就是说,没有通知鸟类已经消失.

通过使用弱指针,它可以在报告时知道哪些鸟仍在那里,何时它们到达(但不是在它们离开时).

(也许我稍后会想到一个更好的例子.)


Exa*_*eta 6

例如:

struct node
{
   std::shared_ptr<node> left_child;
   std::shared_ptr<node> right_child;
   std::weak_ptr<node> parent;
   foo data;   
};
Run Code Online (Sandbox Code Playgroud)

在本例中,删除节点将删除 left_child 和 right_child,但不会删除父节点。如果由于某种原因节点比父节点停留的时间更长,并且父节点被删除,则您有办法知道父节点不再有效。(假设您不使用另一个 shared_ptr 引用 left_child 或 right_child)