使用shared_ptr死亡时原始指针会发生什么

时间:2014-12-02 22:16:46

标签: c++ shared-ptr

我正在开发一个利用由各种组件组成的演员的游戏引擎。这些演员拥有他们的组件,组件也拥有他们的父演员。我有一个名为Destroy的成员函数,它打破了循环引用链,以便清理所有内容。我试图基本上做所有的组件。例如,甚至相机也是附加到某些演员的组件。这意味着诸如渲染器之类的东西需要访问摄像机组件以便提取它们的视图和项目矩阵,因此我想在当前活动摄像机的渲染器和它们渲染到的窗口中保留一个列表。我无法使它成为共享指针,因为这会阻止actor在它们应该被销毁时被破坏。我不想使用弱指针,因为它需要每帧锁定才能获得视图和投影矩阵。所以我打算尝试使用原始指针,然后在使用它之前检查它是否为nullptr。不幸的是,这不起作用。当相机组件的shared_ptr超出范围时,原始指针保持有效但只是指向垃圾?我的印象是shared_ptr应该清理它。这是我需要自定义删除器的情况吗?删除并将值设置为nullptr的那个?

1 个答案:

答案 0 :(得分:3)

  

当相机组件的shared_ptr超出范围时,原始指针保持有效但只是指向垃圾?

然后它不是“有效”;它是悬空

  

我的印象是shared_ptr应该清理它。这是我需要自定义删除器的情况吗?删除并将值设置为nullptr的那个?

您希望指向对象std::shared_ptr的{​​{1}}能够将整个程序中的所有原始指针神奇地设置为值obj&obj吗?那是不可能的!

你有责任将指针弄为空,否则会摇晃。通过在智能指针的同时使用原始指针,你承诺自己知道自己在做什么,并保持原始指针安全,但后来没有这样做。

如果您希望“原始指针”不增加引用计数,但指向另外智能管理的对象,则使用nullptr s。

如果由于某种原因无法使用弱指针,那么,是的,你必须自己将原始指针置空。确实,自定义删除器是一种很好的方法。