一个简短的小问题:
#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)以这种方式移除它们是否安全?
答案 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(资源获取是初始化)!