删除存储在std :: vector中的对象

时间:2012-02-28 14:59:50

标签: c++ iterator stdvector

一个简短的小问题:

#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)是否会删除存储在std :: vector(CObject *)

中的对象

2)以这种方式移除它们是否安全?

2 个答案:

答案 0 :(得分:4)

这是安全的,但可能(非常)缓慢。

向量的第一个元素上的

erase必须移动向量的所有其他元素,因此你的循环是向量大小的O(n ^ 2)。

并且不需要erase元素,因为(a)它们是指针(没有析构函数)而(b)clear无论如何都会这样做。

所以:

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

P.S。 <{1}}没有什么特别“安全”,但这是另一个主题。

P.P.S。 SAFE_DELETE是多余的。

答案 1 :(得分:1)

请帮自己一个忙,并存储智能指针(例如来自boost或C ++ 0x)而不是向量内的原始指针。这也将使您免于安全释放它们的负担。

胜利的RAII(资源获取是初始化)!