gpt4 book ai didi

c++ - 使用原始指针在其 shared_ptr 死亡时发生的情况

转载 作者:行者123 更新时间:2023-11-28 00:21:29 28 4
gpt4 key购买 nike

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

最佳答案

When the shared_ptr to the camera component goes outta scope the raw pointer stays valid but just points to garbage?

那么它就不是“有效的”;它在悬垂

I was under the impression that the shared_ptr should have cleaned it up. Would this be a case where I would need a custom deleter? One that deletes and sets the value to nullptr?

您是否期待 std::shared_ptr指向一个对象obj神奇地将整个程序中的所有原始指针设置为值 &objnullptr ?那是不可能的!

您有责任将可能悬空的指针清零。通过同时使用原始指针和智能指针,您向自己保证您知道自己在做什么并且会保证原始指针的安全,但后来却没有做到。

如果你想要“原始指针”不增加引用计数,而是指向一个智能管理的对象,那么使用 std::weak_ptr s.

如果您出于某种原因不能使用弱指针,那么,是的,您将不得不自己将原始指针清零。确实,自定义删除器是解决此问题的好方法。

关于c++ - 使用原始指针在其 shared_ptr 死亡时发生的情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27260084/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com