c ++中vector <T>中的内存管理

brt*_*rtb 1 c++ memory-leaks memory-management

我有一个名为Animal的类,它有一个虚拟的方法,所以类成为虚拟类.

class Animal
{ 
   virtual double eat() = 0;
};
Run Code Online (Sandbox Code Playgroud)

我还有两个他们是猫和狗的课程,这些课程继承自动物.

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

  vector<Animal *> animals;
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

jua*_*nza 8

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

class Animal
{ 
   virtual double eat() = 0;
 public:
   virtual ~Animal() {}
};
Run Code Online (Sandbox Code Playgroud)

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

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

for (auto a : animals)
  delete a;
Run Code Online (Sandbox Code Playgroud)

然后,您可以清除矢量:

animals.clear();
Run Code Online (Sandbox Code Playgroud)

如果您需要使用animals其他内容,则需要这样做.您不需要在zoo析构函数中执行此操作.

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

  • @cmaster虽然动物园拥有它的动物,但是`shared_ptr`不是最好的选择.但我认为没有足够的信息. (2认同)