2012-12-22 80 views
1

我有一個對象指針向量。我希望能夠刪除這些對象並釋放這些對象佔用的內存。刪除堆棧中分配的對象指針向量中的元素

什麼我現在是這樣的:

這是一個包含對象的指針向量:

std::vector<Ball*> List; 

這是刪除元素的矢量和釋放內存的功能:

void BallManager::DeleteBall(int id) 
{ 
    List[id]->~Ball(); //Not sure if this is needed 
    delete List[id]; 
    List[id] = NULL; 
    List.erase(List.begin()+id); 
} 

我的問題是我是否也需要調用析構函數的對象或是由照顧刪除?

+3

我強烈推薦而不是智能指針的矢量。如果你這樣做,你不需要擔心管理指針的內存;簡單地調用'erase'會釋放內存和所有內容。 – chris

回答

2

如果要刪除指針元素,delete將調用對象析構函數。無需調用 List[id]->~Ball()也不需要將指針設置爲NULL,因爲無論如何您都要擦除元素。

std::vector<Ball*> List; 

void BallManager::DeleteBall(int id) 
{ 
    if (id < List.size()) // should check id is still in range 
    { 
     delete List[id]; 
     List.erase(List.begin()+id); 
    } 
} 

強烈推薦您使用智能指針克里斯提到,那麼你就不需要擔心刪除對象的指針,當你從STL容器,演示如下刪除元素:

std::vector<std::shared_ptr<Ball> > List; 
    void BallManager::DeleteBall(int id) 
    { 
    if (id < List.size()) // should check id is still in range 
    { 
     List.erase(List.begin()+id); 
    } 
    } 
0

你幾乎不需要顯式調用析構函數。通過釋放過程調用它們 - 在動態分配對象的情況下刪除。

請參閱Destructors FAQ瞭解更多詳情。

1

不,調用delete(與dealloc相反)會自動調用析構函數。

刪除元素後,不需要將其設置爲null,您可以將其刪除。

void BallManager::DeleteBall(int id) 
{ 
    delete List[id]; 
    List.erase(List.begin()+id); 
} 

new自動調用構造函數,相應的delete自動調用析構函數。

相關問題