Удаление объектов, хранящихся в std :: vector - PullRequest
0 голосов
/ 28 февраля 2012

Просто небольшой вопрос:

#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 ]

4 голосов
/ 28 февраля 2012

Это безопасно, но потенциально (очень) медленно.

erase на первый элемент вектора должен переместить все остальные элементы вектора, поэтому ваш цикл равен O (n ^ 2) по размеру вектора.

И нет необходимости erase элементов, поскольку (а) они являются указателями (без деструктора) и (б) clear все равно это сделает.

Итак:

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

P.S. В вашем SAFE_DELETE нет ничего особенно "безопасного", но это уже другая тема.

P.P.S. if (p) delete p; является избыточным.

1 голос
/ 28 февраля 2012

Пожалуйста, сделайте себе одолжение и храните умные указатели (например, из boost или C ++ 0x) вместо необработанных указателей внутри вектора.Это также избавит вас от необходимости их безопасного освобождения.

RAII (Инициализация ресурсов - инициализация) для победы!

...