【问题标题】:Using smart pointers for observation purposes使用智能指针进行观察
【发布时间】:2015-07-05 05:35:59
【问题描述】:

我有一个大型应用程序,其中任务部分是建模对象,另一部分是时间轴支持的对象动画。用户可能会在时间轴仍在为其设置动画时删除可动画对象。

时间线通过智能指针访问(动画)对象,因此在使用它之前通过检查智能指针的有效性来检查对象是否存在非常容易。但这感觉有点“脏”……就像用安全带固定行李一样。但是我们讨论的其他机制或多或少是相同的:对象在其他地方注册并在删除时取消注册,这正是智能指针所做的。

这是测试智能指针有效性的有效用例吗?

【问题讨论】:

    标签: c++ pointers


    【解决方案1】:

    在我看来,std::weak_ptr 会很适合这份工作。弱指针不保证指针下对象的存在,如果对象将被删除,其他引用可动画对象的对象将知道。总是要使用这个指针,它必须被锁定(强制检查它的存在)。

    【讨论】:

      【解决方案2】:

      我不明白你如何在这里使用std::shared_ptr,因为它是Observer Effect problem(通过测试,你正在改变它)。如果你持有一个std::shared_ptr 到一个对象上,那么它在定义上就是有效的。

      OTOH,有std::weak_ptr,正是为此目的而构建的。它仅充当shared_ptr 的观察者。

      std::weak_ptr是一个智能指针,它持有对 std::shared_ptr 管理的对象的非拥有(“弱”)引用。必须将其转换为 std::shared_ptr 才能访问引用的对象。


      如果您的程序是多线程的,顺便说一句,您需要通过其他机制(例如锁定)来处理有人在您观察对象时删除对象的情况。

      【讨论】:

      • 多线程:不需要锁定shared_ptr的内容(除非内容被修改)。
      • @DieterLücking 同意。我认为这正是内容的变化才是问题所在。感谢您的澄清!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-10
      • 2015-10-23
      • 1970-01-01
      • 1970-01-01
      • 2017-08-22
      • 1970-01-01
      相关资源
      最近更新 更多