如何解决vector容器erase崩溃
我有一个大的列表树,每个选项都有复选框,当我选中一个选项的时候就会将其信息push到一个容器里面,但当我在选中另一个选项时就会自动取消开始那个选项并且清除容器,问题就是在我erase它的时候程序崩溃在erase内部了,这块不是很懂,求高手帮我看一下。代码如下:
vec_Task::iterator Iter1 ;
Iter1=CGlobal::s_resMng._taskList.begin();
for(;Iter1!=CGlobal::s_resMng._taskList.end();Iter1++)
{
TaskNode* p= *Iter1;
if(p->Task == name) //name就是对应我要删的那个选项
{
CGlobal::s_resMng._taskList.erase(Iter1); //此处出现bug 20141009
break;
}
}
崩溃的具体地方是在vector.cpp里面:
#if _ITERATOR_DEBUG_LEVEL == 2
iterator erase(const_iterator _Where)
{ // erase element at where
if (_VICONT(_Where) != this
|| _VIPTR(_Where) < this->_Myfirst
|| this->_Mylast <= _VIPTR(_Where))
_DEBUG_ERROR("vector erase iterator outside range");
_Move(_VIPTR(_Where) + 1, this->_Mylast, _VIPTR(_Where));
_Destroy(this->_Mylast - 1, this->_Mylast);
_Orphan_range(_VIPTR(_Where), this->_Mylast);
--this->_Mylast;
return (_Make_iter(_Where));
}
_Orphan_range代码如下:
#if _VECTOR_ORPHAN_RANGE
void _Orphan_range(pointer _First, pointer _Last) const
{ // orphan iterators within specified (inclusive) range
_Lockit _Lock(_LOCK_DEBUG);
const_iterator **_Pnext = (const_iterator **)this->_Getpfirst();
if (_Pnext != 0)
while (*_Pnext != 0)
if ((*_Pnext)->_Ptr < _First || _Last < (*_Pnext)->_Ptr)
_Pnext = (const_iterator **)(*_Pnext)->_Getpnext();
else
{ // orphan the iterator
(*_Pnext)->_Clrcont();
*_Pnext = *(const_iterator **)(*_Pnext)->_Getpnext();
}
}
我单步执行后发现程序在while (*_Pnext != 0)处循环了大概6次后在if判断这块崩溃不能往下执行,提示发生访问内存冲突,当我关闭程序后,程序在utility.cpp跳出中断:
inline void _Container_base12::_Orphan_all()
{ // orphan all iterators
#if _ITERATOR_DEBUG_LEVEL == 2
if (_Myproxy != 0)
{ // proxy allocated, drain it
_Lockit _Lock(_LOCK_DEBUG);
for (_Iterator_base12 **_Pnext = &_Myproxy->_Myfirstiter;
*_Pnext != 0; *_Pnext = (*_Pnext)->_Mynextiter)
(*_Pnext)->_Myproxy = 0;
_Myproxy->_Myfirstiter = 0;
}
#endif /* _ITERATOR_DEBUG_LEVEL == 2 */
}
这个是为什么呢