繁体   English   中英

向量中的内存管理 <T> 在C ++中

[英]memory management in vector<T> in c++

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

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

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

还有第四类-zoo-它有一个领域

  vector<Animal *> animals;

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

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

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

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

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

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

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

接下来,您需要对所有动态分配的Animals调用delete

for (auto a : animals)
  delete a;

然后,您可以清除向量:

animals.clear();

如果您需要将animals用于其他用途,这是必需的。 您无需在zoo析构函数中执行此操作。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM