2010-04-26 90 views
1
class Equipment 
{ 
    std::vector<Armor*> vEquip; 
    Weapon* mainWeapon; 
    int totalDefense; 
    int totalAttack; 

public: 

    unsigned int GetWeight(); 

    int * GetDefense(); 

    bool EquipArmor(Armor* armor); 
    bool UnequipArmor(Armor* armor); 

    bool EquipWeapon(Weapon* wep); 
    bool UnequipWeapon(Weapon* wep); 

    Equipment(); 
    virtual ~Equipment(); 
}; 

看來應該沒有析構函數。指針向量在超出範圍時會自行處理,並且指針指向的實際對象不需要被刪除,因爲會有其他引用。這個類的析構函數是什麼樣的?

都在這個對象指的是主容器:

class Container 
{ 
    int weightLimit; 
    unsigned int currWeight; 
    std::vector<Item*> vItems; 

public: 

    bool AddItem(Item* item); 
    bool RemoveItem(Item* item); 

    Container(); 
    Container(int weightLim); 
    Container(int weightLim, std::vector<Item*> items); 
    ~Container(); 
}; 

現在,這裏我可以看到它是需要刪除容器中的所有對象,因爲這是所有的對象都通過的AddItem分配(新項目(「嗒嗒」))

(盔甲和武器從項目繼承)

+0

1.「There will be其他引用它「。那麼其他引用的所有者怎麼知道何時可以安全地刪除這些對象呢? – pmr 2010-04-26 19:10:56

+1

'mainWeapon'是一個C++指針(與一個更智能的指針相比),析構函數應該考慮到重新分配。 :: shared_ptr'或'scoped_ptr',如果你想讓指針處理分配和解除分配,一個智能指針向量是沒有問題的,但是析構函數應該釋放向量中所有指針所使用的內存,然後銷燬該向量。 – 2010-04-26 19:15:18

回答

1

非指針類型將自行處理。因此,整數,浮點數,對象等會自行處理,而且您不必擔心刪除它們。

任何由該類管理的指針都需要被該類的析構函數刪除。所以,如果指針指向的內存在類中被分配,或者如果它被賦予該類並且該類將會管理它,那麼析構函數需要刪除指針。

如果指針指向另一個類正在管理的內存,那麼顯然你不希望你的析構函數將其刪除。這是負責指針指向的內存的類的工作。

標準容器做不是管理他們握住的指針,如果他們拿着指針。所以,如果你有一個指針的容器,無論哪個類應該管理它們,都需要刪除它們。有可能是那個容器包含的類,但這取決於你的代碼在做什麼。

所以,通常情況下,對於具有指針的容器類,你需要像這樣在析構函數:

for(containerType<T*>::iterator iter = container.begin(), 
           end = container.end(); 
    iter != end; 
    ++iter) 
{ 
    delete *iter; 
} 

已內存分配給它必須有一些(一般每指針一個類,但有時它分配的功能)誰有效擁有該內存並確保它被釋放。在討論類時,通常是與內存分配在同一類中,但當然,一個類或函數很可能分配內存,然後將內存的所有權有效地傳遞給另一個類或函數。無論如何,擁有內存的人需要處理清理問題。這就是你的析構函數需要擔心的事情:清理該類擁有的任何資源。

0

如果我理解正確的話,你問如何刪除在主容器的析構函數從vItems矢量項目?

for(std::vector<Item*>::iterator i=vItems.begin(),ie=vItems.end();i!=ie;++i) 
    delete *i; 

這就是你要求的嗎?

1

如果您需要刪除的項目,然後:

Container :: ~Container() { 
    for (unsigned int i = 0; i < vItems.size(); ++i) { 
     delete vItems[i]; 
    } 
} 

請注意,這才能正常工作,該項目類必須有一個虛析構函數,如果陣列真的包含指向盔甲和武器的情況。

0

如果您的載體可以

std::vector<std::tr1::shared_ptr<Item> > 

,那麼你就不會需要一個析構函數。就像現在一樣,析構函數必須遍歷向量才能刪除所有項目。 BOOST_FOREACH最簡單。

-1

這取決於你如何實現它。如果您添加的項目是從對象之外管理的(即addItem()的主體看起來像這樣:{ vItems.push_back(items); }),那麼您不需要該對象的析構函數。但是,如果項目由對象管理(即addItem()看起來像這樣:{ vItems.push_back(new Item(item)); },那麼您將需要刪除析構函數中的所有項目,因爲沒有人會爲您執行此操作。

相關問題