2014-02-17 80 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