删除STL向量中的条目

时间:2011-11-29 06:07:22

标签: c++ stl

我想清理指针存储在STL向量中的线程。我这样做如下。这是正确的做法,因为我在循环thourgh向量时删除条目或者有更好的方法来执行此操作。

请建议。

template <typename threadFuncParamT >
bool ThreadPool<threadFuncParamT>::KillSleepingThreads()
{
  if(m_vecThreads.size() != 0)
  {
      for (; std::vector< ThreadWrapper < threadFuncParamT>* >::iterator itrCollThreads !=  values.end(); )
      {
    ThreadWrapper < threadFuncParamT> *pWrapper = m_vecThreads.back();
            m_vecThreads.pop_back();
            delete pWrapper;
      } // for loop
  } // if condition
}

谢谢!

3 个答案:

答案 0 :(得分:4)

如果你被允许使用C ++ 11,那就让它变得可爱:

for (auto it = m_vecThreads.begin() ; it !=  m_vecThreads.end(); ++it )
{
     delete *it;
}
m_vecThreads.clear();

你可以让它更可爱(当然,在C ++ 11中 - 感谢@ celtschk的评论):

for (auto & ptr: m_vecThreads) //it is called range-based for loop
{ 
    delete ptr; 
}
m_vecThreads.clear();

或者如果您 允许使用C ++ 11,则替换auto(在第一个 for循环中)用这个:

  typename std::vector<ThreadWrapper<threadFuncParamT*>::iterator
//^^^^^^^^ you've to typename as well

请注意,您也可以使用typename,因为iterator是附属名称。

此外,不需要以下内容,请将其从代码中删除:

if(m_vecThreads.size() != 0) // not needed!

答案 1 :(得分:0)

在你的函数中试试这个:

     for(size_t i = 0; i < m_vecThreads.size(); ++i)
     {
        delete m_vecThreads[i];
     }
     m_vecThreads.clear();

答案 2 :(得分:0)

它看起来要复杂得多。如果您真的想删除向量中的每个项目,只需delete每个项目,然后清除整个向量。

for(std::vector<ThreadWrapper<threadFuncParamT*>>::iterator
        i = m_vecThreads.begin();
    i != m_vecThreads.end();
    ++i)
{
    delete *i;
}

m_vecThreads.clear();

顺便说一句,拥有一个智能指针向量(例如boost::shared_ptr)通常比不必明确删除项目更好。