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

我正在阅读Nicolai M. Josuttis的“C标准图书馆”一书,以了解弱点.作者提到了需要有一个weak_ptr的两个原因而我没有得到第二个原因.任何人都可以提供一个简单的解释以及以下原因的例子(引自书中):

Another example occurs when you explicitly want to share but not own an object. Thus, you have the semantics that the lifetime of a reference to an object outlives the object it refers to. Here, shared_ptrs would never release the object, and ordinary pointers might not notice that the object they refer to is not valid anymore, which introduces the risk of accessing released data.

最佳答案
该语句的后半部分应该是清楚的:如果一个指针不是一个拥有指针,那么它所指向的对象可能会被所有者的任何软件删除 – 然后你就会有标准的悬空引用.

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

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

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

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

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

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

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

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

转载注明原文:为什么我们需要C 11中的weak_ptr? - 代码日志