2012-04-20 42 views
1

我有此類:C++ - 適當的方式來對堆清除類矢量

class GameData 
{ 
public: 
    GameData(); 
    ~GameData(); 
    vector<Bullet> bullets; 
} 

在主程序中,我創建GAMEDATA指針和用於將其與新的分配內存。我知道新的,你也應該刪除數據。上面的向量不是Bullets指針的向量,只是Bullets本身(它們應該是指針嗎?)在〜GameData()函數中,我需要清理子彈需要什麼?我應該確保它是空的,如果不清楚它?爲了良好的內存管理,「刪除」它的具體方法是什麼?如果我的設計錯誤,請讓我知道我應該如何處理這個問題。

感謝

+0

@Als當然。象vector中的所有容器一樣,vector也具有值語義。向量中的對象的行爲就好像它們是向量的成員一樣,並且只要對象不再處於向量中,它就會被正確地破壞。 – 2012-04-20 07:27:56

+0

@JamesKanze:是的。但是任何標準庫容器都不會獲得指針成員(原始或智能)的所有權,即。釋放動態內存的責任取決於用戶或內置的RAII語義(在智能指針的情況下)。從容器的角度來看,這是有意義的,因爲容器沒有任何指針元素的所有者知識。它沒有「甚至不知道是否在這方面的分配是在freestore上進行的。 – 2012-04-20 07:30:55

+0

@Als這是因爲「所有權」是一種人爲的概念,很少與任何事物相關。容器中的對象不是容器「擁有」的,它們邏輯上是容器的一部分。對於任何其他類而言,容器的唯一特殊性是它的一部分對象可以動態變化。如果對象具有指針類型,當然,它是指向容器一部分的指針,而不是它們指向的任何指針。 – 2012-04-20 08:05:51

回答

5

在〜GameData()函數中,我需要清理子彈嗎?

不是。它由向量的析構函數完成,它將自動調用。

-

我創建了一個GAMEDATA指針和它與新的分配內存。我知道新的,你應該有刪除的數據,以及

你不必這樣做,如果你使用某種形式的智能指針,如std::unique_ptrstd::shared_ptr。使用智能指針,您不必刪除它,因爲它是智能指針本身的責任。

從這裏閱讀部分智能指針

+0

感謝您的建議,提升有這樣的事情,我已經看過它。作爲一個明顯的新手C++程序員,我想在學習可以讓我的生活更輕鬆的東西之前學習裸機的東西:)謝謝你 – will 2012-04-20 06:41:02

+0

@will:我認爲它應該是另一種方式:首先學習如何使用讓程序員生活更輕鬆的東西,之後你應該學習細節,包括使用'new'和'delete'進行手動內存管理。 – Nawaz 2012-04-20 06:42:41

+0

touche :)一個問題,是向哪裏製造Bullet的副本遍佈整個地方?它應該是一個指針嗎?如果它是一個子彈頭指針的矢量,那麼我需要自己處理刪除嗎? – will 2012-04-20 06:54:42

3

您不必擔心GamaData成員,只要確保你刪除GamaData實例,因爲你用new創建它。