我的API函数应该使用shared_ptr还是weak_ptr

psc*_*ill 6 c++ shared-ptr weak-ptr

我目前正在设计一个API,我不确定我的功能是否应该采用shared_ptrweak_ptr.有些小部件包含查看器.观众具有add_painter向观众添加画家的功能.当观众需要重绘时,它会使用画家绘制缓冲区并显示结果.我得出结论,观众应该使用weak_ptr以下方式来控制画家:

  • 画家可以在多个观众中使用,因此观众不能拥有画家.
  • 删除画家应将其从观看者中删除.这样,用户无需记住他们必须调用remove_painter函数.

可能有不同类型的查看者,因此它们隐藏在界面后面.什么签名最适合add_painter界面中的功能?

我应该直接使用void add_painter(weak_ptr<Painter> const& p)吗?这意味着具体的实现存储画家使用weak_ptr,但我不能强制执行:实现可以只做painters.push_back(weak_ptr.lock())和存储shared_ptr.

我应该用void add_painter(shared_ptr<Painter> const& p)吗?这意味着观众拥有强大的引用,因此删除画家不一定会将其从观看者中删除.

我还考虑将画家直接存储在接口类中,但是它不再是真正的接口,是吗?

jsz*_*ski 1

您不应该尝试使用智能指针来缓解观察者模式,并且绝对应该避免客户端(视图)可以通过将弱指针转换为共享指针并无限期存储它以防止服务器释放它来骚扰服务器的情况。

您确实应该考虑这里的经典观察者模式,请求 View 提供painter_destroyed回调函数。这可能会很麻烦,但一旦画家被摧毁,客户也有机会实施一些额外的行动。否则,当人们想要使用画家时发现它不再存在可能会非常令人恼火,并影响整体程序性能。