2014-02-17 40 views
1

我有一个名为Animal的类,它有一个虚拟的方法,所以类变成了虚拟类。向量中的内存管理C++中的内存管理<T>

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

我有两个类,他们是猫和狗,这些类继承了动物。

,并有第四类-zoo-,它有一个场

vector<Animal *> animals; 

我正在推动的猫,狗实例动物园对象的动物载体。

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

我到底应该做什么。 除动物园以外的所有类都只有浮点字段(无指针)。 (float a,b等) 所以我们可以说,没有必要处理动物物体,因为他们没有任何指针。

我应该在哪里写析构函数。在一个基类(动物)或一个亚类(猫狗)或无处可以或我应该如何写这些析构函数。

回答

8

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

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

这是必需的,使得在一个Animal指针调用delete会调用该对象的类型的析构函数的指针指向。如果不使用虚拟析构函数,则会导致未定义的行为。

接下来,你需要呼吁所有动态分配Animalsdelete

for (auto a : animals) 
    delete a; 

然后,您可以清除载体:

animals.clear(); 

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

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

+0

让我补充说'std :: shared_ptr '可能是更好的选择。然而,'unique_ptr <>'和'shared_ptr <>'都不是完美的。 – cmaster

+2

@cmaster我会尽管动物园拥有它的动物,所以'shared_ptr'不会是最好的选择。但我不认为有足够的信息。 – juanchopanza

+0

我不想以任何方式批评你,我只是想**在你的回答中加上**,表示可能有更好的选择。在类似的情况下,有大量的用例需要'shared_ptr'。 – cmaster