我的 API 函数应该shared_ptr还是weak_ptr

Should my API functions take shared_ptr or weak_ptr

本文关键字:ptr 还是 weak shared API 函数 我的      更新时间:2023-10-16

我目前正在设计一个 API,我不确定我的函数应该采用shared_ptr还是weak_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)吗?这意味着观众拥有很强的参考,因此删除画家并不一定将其从观看者中删除。

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

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

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