c ++中<vector>中的内存管理</t>

时间:2014-02-17 13:35:53

标签: c++ memory-management memory-leaks

我有一个名为Animal的类,它有一个虚拟方法,因此该类成为虚拟类。

class Animal
{ 
   virtual double eat() = 0;
};

我还有两个类,它们是猫和狗,这些类继承自动物。

并且有第四类-zoo-并且它有一个字段

  vector<Animal *> animals;

我正在将猫狗实例推向动物园对象的动物矢量。

我想在任何时候清除动物园实例,我也希望删除此对象的向量。我也希望删除这些对象的矢量对象。

我应该怎么做。 除了动物园之外的所有类都只有浮点字段(没有指针)。 (浮动a,b等) 所以我们可以说没有必要处理动物物品,因为它们没有任何指针。

我应该在哪里写析构函数。在基类(动物)或子类(猫 - 狗)或无处 或者我该如何编写这些析构函数。

1 个答案:

答案 0 :(得分:8)

首先,您需要声明一个给予Animal虚拟析构函数:

class Animal
{ 
   virtual double eat() = 0;
 public:
   virtual ~Animal() {}
};

这是必需的,以便在delete指针上调用Animal将调用指针指向的对象类型的析构函数。在没有虚拟析构函数的情况下执行此操作会导致未定义的行为。

接下来,您需要在所有动态分配的delete

上调用Animals
for (auto a : animals)
  delete a;

然后,您可以清除矢量:

animals.clear();

如果您需要将animals用于其他内容,则必须执行此操作。您不需要在zoo析构函数中执行此操作。

或者,您可以使用std::vector<std::unique_ptr<Animal>>而忘记手动内存管理。