c++ - 所有权以及如何避免 shared_ptr

标签 c++ event-handling shared-ptr ownership

我正在尝试为游戏引擎编写一个简单的事件管理器类和监听器。在通常的实现中(即 McShaffry ),事件管理器注册监听器,原则上将 shared_ptr 作为私有(private)成员保存到监听器。

我在很多情况下看到人们说应该避免使用 shared_ptr 之类的东西(例如 here )。因此,我试图找到在不共享监听器所有权的情况下实现事件管理器的方法。

我想到的一种方法是为监听器分配唯一 ID,并向事件管理器注册它们的 ID。然后,监听器负责在事件管理器更新后“询问”其 ID 下是否有可用的事件。

我想问一下,在这种情况下,是否有更简洁和/或标准的方法来避免共享所有权,但也通常如此。例如,我对听众有同样的问题。监听器需要存储指向其父级(或它们正在监听的对象)的指针,以便它们可以在处理事件时调用其方法。

最佳答案

正如 Mat 的评论所说,一般没有理由不使用智能指针。也就是说,警告确实似乎适用于您的情况:据我了解,您没有共享所有权;事件管理器拥有监听器的唯一所有权。因此,shared_ptr 在这里不合适。

另一种方法是使用 unique_ptr,它在很多方面都是 shared_ptr 硬币的另一面。但是,根据您为监听器建模的方式,甚至可以通过简单地将具体实例 保存到事件管理器来避免这种情况。如果没有更详细的描述,就不可能说您是否需要指针,但是如果您不需要它们,那么,是的,建议适用:当具体对象需要时,不要使用(智能)指针做。

最后,如果您的监听器是其所有权在别处管理的对象,请考虑简单地使用指向这些对象的原始指针:在这种情况下,事件管理器根本不是对象的所有者——唯一或共享所有者。虽然这对我来说是首选方式,但它需要仔 segmentation 析监听器的生命周期,以确保事件管理器不会指向不再存在的监听器。

关于c++ - 所有权以及如何避免 shared_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14262906/

相关文章:

c++ - C++ 中的基本多线程(执行顺序)

c++ - 如果需要构造建议

python - wx中表格自动调整大小

delphi - 即使菜单项未启用,也可以接收 OnClick 事件吗?

c++ - boost::detail::spinlock_pool中的错误共享?

c++ - 小型 clang 项目上的 std::terminate() 链接器错误

c++ - 为什么 strlen(s) 与 s 的大小不同,为什么 cout char 显示的是字符而不是数字?

c# - 有没有更好的方法在 C# 中初始化 EventHandler

c++ - 加入后线程上的共享指针计数为 1?

c++ - 带有 shared_ptr 的 RAII