代码之家  ›  专栏  ›  技术社区  ›  Fishie

作为类成员的智能指针是否仍然自动释放?[关闭]

  •  -3
  • Fishie  · 技术社区  · 7 月前

    我正在用C++开发一款游戏,并一直在使用智能指针的向量来存储一些关卡数据。游戏运行正常,但我想知道指针所占用的内存是否真的被自动释放了。下面是我的代码结构的简化版本作为示例。

    我有一个结构体 Level 三个班级 Game , Enemy ,以及 Grunt (继承自 敌人 ). 在结构体中,我有一个 vector 类型的智能指针 敌人 和in 游戏 我创造了一个 级别 作为成员如下:

    #include <vector>
    #include <memory>
    
    class Enemy 
    {
    };
    
    class Grunt : public Enemy
    {
        public:
            Grunt() {}
            ~Grunt() {}
    };
    
    struct Level
    {
      std::vector<std::shared_ptr<Enemy>> eVector;
    };
    
    class Game
    {
     private:
       Level level1 = {{std::make_shared<Grunt>()}};
    };
    
    int main()
    {
        Game g;
    }
    

    A. 游戏 对象是在我的 main() ,用于开始游戏循环。

    在我的代码中,我使用 level1 访问 矢量 我的问题是,既然它是类的成员变量 游戏 因此,智能指针永远不会超出范围 矢量 是否仍在自动释放?如果没有,我该如何最好地手动释放它们?

    2 回复  |  直到 7 月前
        1
  •  2
  •   Remy Lebeau    7 月前

    a的要素 std::vector 只要它们仍在向量中,就保留在内存中。如果你删除一个元素,它将被销毁。当载体本身被破坏时,其中的任何剩余元素都将被破坏。

    在这种情况下,向量元素是 shared_ptr 物体。摧毁a shared_ptr 递减它所指向的对象的引用计数。当引用计数降至0时,该对象将被销毁。

    Game 对象在作用域中保持活动,其 Level 成员还活着,其 std::矢量 成员还活着,任何 shared_ptr 其中的元素是活的。

    游戏 对象超出范围,它被破坏,这破坏了它的 级别 成员,这会破坏其 vector 成员,这会破坏其 shared_ptr 破坏其指向的元素 Enemy 物体。


    附言:你的 敌人 类型应具有 virtual 析构函数确保派生对象被销毁 适当地 通话时 delete 在A Enemy* 指针。这对 std::shared_ptr 特别是当使用派生类型创建时,如 Grunt ,但这对 std::unique_ptr 以及原始指针,所以这是你应该注意的。

        2
  •  1
  •   Remy Lebeau    7 月前

    类实例的每个成员都在包含类实例的析构函数中被释放。智能指针解决的问题是,当实例被销毁时,只有程序员才能知道是否也应该销毁实例中间接包含的对象。我们使用原始指针作为非拥有指针,它们在被销毁时不会破坏指针。当我们希望在最后一个指针被销毁时销毁指针时,我们使用拥有/智能指针。

    作为类成员的智能指针是否仍然自动释放?

    坦率地说,这个问题是误解内存管理和所有权的症状。正如我上面试图解释的那样,实例的每个成员都会自动释放。这不适用于成员指针指向的对象。除非他们是聪明的指针。智能指针始终正确管理被指针的生命周期,无论它们是否是类的成员。

    推荐文章