[英]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.