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

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

我还有另外两个类(class),它们是猫和狗,这些类(class)是从动物那里继承的。

还有第四类-zoo-它有一个 Realm
  vector<Animal *> animals;

我将猫和狗实例推到动物园对象的动物 vector 中。

在任何时候我都想清除动物园实例,并且我也想删除该对象的 vector 。我也希望删除此对象的 vector 对象。

我到底该怎么办。
除了zoo之外的所有类都只有float字段(没有指针)。 ( float a,b等)
因此,我们可以说没有必要处理动物对象,因为它们没有任何指针。

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

最佳答案

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

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

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

接下来,您需要在所有动态分配的delete上调用Animals:
for (auto a : animals)
  delete a;

然后,您可以清除 vector :
animals.clear();

如果您需要使用animals进行其他操作,则这是必需的。您不需要在zoo析构函数中执行此操作。

另外,您可以使用std::vector<std::unique_ptr<Animal>>而不用手动进行内存管理。

关于c++ - C++中vector <T>中的内存管理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21830533/

10-14 13:26
查看更多