【问题标题】:delete a vector of pointers to abstract class删除指向抽象类的指针向量
【发布时间】:2020-03-27 08:56:14
【问题描述】:

我有一个抽象的实体类。我在游戏循环中使用指向 Entity 的指针的 std::vector,以便我可以创建在游戏期间动态扩展 Entity 的类的对象。 我想避免内存泄漏,所以我想释放vector占用的内存。

这就够了吗?

GameLoop::~GameLoop() {
    int n = entities.size();
    for (int i = 0; i < n; i++)
        entities.pop_back();
}

实体在哪里

std::vector<Entity*> entities

【问题讨论】:

  • 任何你new,你需要delete,但在可能的情况下更喜欢自动存储或智能指针。
  • 很遗憾,这是否“足够”只有你自己能判断。如果这些对象仍将在其他地方引用,这将不起作用,显然因为这会留下悬空指针。如果这些对象还拥有其他一些动态范围的对象,并且它们的析构函数不会删除它们,那么这也是不够的。您需要充分了解您的整个应用程序如何使用这些对象、何时构造它们以及何时不再在任何地方使用它们,以确定显示的代码是否“足够”。
  • 您可能想使用std::unique_ptr

标签: c++ memory vector std


【解决方案1】:
for (int i = 0; i < n; i++)
    entities.pop_back();

一个更短更快速的方法是entities.clear()

假设entities是一个成员,甚至不需要清除它:对象即将被立即销毁,其成员将被销毁,vector自动清除其元素。

但是请注意,如果向量中的指针拥有指向的对象,那么您确实会泄漏内存,因为指针将不复存在,因此无法再删除先前拥有的对象。

为了让拥有指针释放由new 进行的动态分配,您必须delete 指针。但是,您不应该使用拥有裸指针(除非您正在实现一个循环返回自身的链表)。请改用智能指针和 RAII 容器。

附:通过指向基的指针删除对象的行为是未定义的,除非基的析构函数是虚拟的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 2013-04-14
    • 1970-01-01
    • 2018-08-09
    • 2013-09-24
    相关资源
    最近更新 更多