2012-02-28 59 views
0

只是一個快速的小問題:刪除對象:: vector的

#define SAFE_DELETE(p) if((p)) { delete(p); (p) =NULL; } 
#define SAFE_DELETE_A(pa) if((pa)) { delete[](pa); (pa)=NULL; } 

    // Add objects to our vector 
    for(int a = 0; a< 150; a++) 
    { 
     CObject *pNewObject = new CObjectPlane(...) 
     m_vpObjects.push_back(pNewObject); 

    } 


    // Delete all objects stored in our vector 
    std::vector<CObject*>::iterator itObject; 
    for(itObject = m_vpObjects.begin(); itObject!=m_vpObjects.end();) 
    { 
     SAFE_DELETE((*itObject)); 
     itObject = m_vpObjects.erase(itObject); 
    } 

    m_vpObjects.clear(); 

1)將存儲在性病中刪除對象::向量(CObject的*)

2)它是安全的這樣刪除它們?

+6

你的SAFE_DELETE()有點傻。 C++保證在NULL指針上刪除是一個noop,所以不需要先檢查。 – FatalError 2012-02-28 15:03:20

+1

另外我認爲這些#定義不是一個好主意 - 它們可能會導致一些副作用。有點偏離主題,但它是使用原始指針而不是某種智能指針的要求嗎? – 2012-02-28 15:06:57

回答

4

這是安全的,但可能(非常)緩慢。

erase在矢量的第一個元素上必須移動矢量的所有其他元素,因此您的循環的矢量大小爲O(n^2)。因爲(a)它們是指針(沒有析構函數),(b)clear無論如何都會這樣做。

所以:

for (itObject = m_vpObjects.begin(); itObject!=m_vpObjects.end(); ++itObject) 
    SAFE_DELETE((*itObject)); 

附:關於你的SAFE_DELETE沒有什麼特別的「安全」,但這是另一個話題。

P.P.S. if (p) delete p;是多餘的。

+0

全部清楚,謝謝。 – PeeS 2012-02-28 15:15:29

+0

@PeeS - 是的。 「清除」與逐個刪除所有元素具有相同的效果。 – Nemo 2012-02-28 15:15:36

1

請自己幫忙,並存儲智能指針(例如從boost或C++ 0x),而不是向量中的原始指針。這也可以讓你免除安全釋放它們的負擔。

RAII(Resource Acquisition is Initialization)for the win!