【问题标题】:How to free a vector?如何释放向量?
【发布时间】:2020-10-14 22:55:54
【问题描述】:

我在课堂上写过

class Game {
private:
    mtm::Dimensions dimensions;
    std::vector<Character*> board;


public:
    explicit Game(int height, int width):dimensions(height,width), board(height*width){
    }

    ~Game() {}
};

但是我应该如何释放我的向量,如果我将 d'tor 留空,我认为它会泄漏内存。

【问题讨论】:

  • 这取决于Character* 的来源。如果它是用new 分配的,那么是的,你必须delete 它。
  • 该向量将被自动销毁(因为它是一个成员),并且该向量负责销毁其元素,但我认为泄漏是元素指向的Character 对象。你真的需要向量中的指针吗?
  • 如果它们不必是指针,那么您可以使用std::vector&lt;Character&gt;。如果必须如此,您可以使用std::vector&lt;std::shared_ptr&lt;Character&gt;&gt; ... “拥有”他们)
  • 让你的 vector 持有智能指针 - std::unique_ptrstd::shared_ptr 而不是原始指针,那么当 vector 死亡时,矢量元素将自动死亡。或者只是将对象保存在向量中,而不是指向对象的指针。然后清理也是自动的。
  • 在你做任何事情之前你需要determine who ownsboard的元素指向的分配。

标签: c++ class methods


【解决方案1】:

如果Game 不是所有者,它不能释放内存。主人必须清理。

如果Game 是所有者,它可以删除析构函数中的所有元素

~Game() {
    for (auto &character : board) {
        delete character;
    }
}

更好的方法是使用智能指针并移除析构函数

std::vector<std::unique_ptr<Character>> board;

您应该尝试关注rule of 0

【讨论】:

    【解决方案2】:

    假设您的 Game 拥有这些对象,那么您的 Game 析构函数将需要释放内存。据推测,Characters 分配有new。下面将删除board中的所有Characters,然后类变量(如vector)将自动释放。

    ~Game() {
       for ( Character *character : board )
          delete character;
    }
    

    除非这是针对指针的练习,否则一般建议不要使用裸指针,而是使用智能指针,例如unique_ptrshared_ptr

    std::vector<std::shared_ptr<Character>> board;
    

    在这种情况下,不会有泄漏,因为一旦没有人指向它们,Characters 将自动被释放。

    shared_ptrunique_ptr 的使用取决于你在做什么。

    【讨论】:

      【解决方案3】:

      向量是一个成员变量。成员变量,就像所有子对象一样,在超级对象被销毁时会自动销毁。隐式生成的析构函数对向量做了正确的事情。

      请注意,向量包含指针。如果这些指针指向动态分配的对象,并且是指向这些对象的唯一指针,则必须删除这些对象,否则它们会泄漏。如果其他东西拥有指向的对象,那么在这个析构函数中不需要做任何事情。

      隐式析构函数正确的示例。对于此示例,我假设该成员是公开的:

      {
          Character c;
          Game g;
          g.board.push_back(&c);
      } // no leaks
      

      避免拥有裸指针。如果您需要动态对象的所有权,请优先使用 RAII 容器或智能指针。

      【讨论】:

        【解决方案4】:

        向量析构函数不会泄漏内存,您应该为向量中使用的类型编写析构函数。另外,我不推荐指向不会破坏自身的东西的指针。

        我认为您正在寻找的是智能指针。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-02-26
          • 2013-05-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多