我想清理指针存储在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
}
谢谢!
答案 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
)通常比不必明确删除项目更好。