typedef list<int *> IntPtrList; IntPtrList int_list; for(int i=0; i < 5; i++)
{
int *pInt = new int;
int_list.push_back(pInt);
} IntPtrList::iterator Iter;
for(Iter = int_list.begin(); Iter != int_list.end(); Iter++)
{
int *pInt = (*Iter);
int_list.erase(Iter);
delete pInt;
pInt = NULL;
} getch();这种写法有野指针.

解决方案 »

  1.   


     
      for(Iter = int_list.begin(); Iter != int_list.end(); Iter++)
    {
    int *pInt = (*Iter);
    int_list.erase(Iter);
    delete pInt;
    pInt = NULL;
    }
       ----------------------------------------------------------
       erase导致迭代器失效.
      

  2.   

    楼主是要删除List的所有信息吗?
    如果是这样,直接List.clear();如果是要遍历队列的信息,可以不用erase(),在循环完成后调用clear()
      

  3.   

    问题是我另外一个线程随时可能添加新的条目进来,如果clear,可能把没有遍历的也给清除了!
     用vector可以吗?
      

  4.   

    IntPtrList::iterator Iter;
    IntPtrList::iterator IterLast = int_list.end();         
    for(Iter = int_list.begin(); Iter != IterLast; )
    {
    int *pInt = (*Iter);
                      if(whattrue(pInt))
    {
                           int_list.erase(Iter++);
         delete pInt;
                       }
                      else
                          ++Iter; }
     
    试试看
      

  5.   

    你用多线程呀,那千万就不要用list,用queue多好呀
      

  6.   

    我用vector是正常的.我做了互斥操作.
      

  7.   

    //修改如下 
    IntPtrList int_list; for(int i=0; i < 5; i++)
    {
    int *pInt = new int;
    int_list.push_back(pInt);
    } IntPtrList::iterator Iter;
    while(true)
    {
    Iter = int_list.begin();
    int *pInt = reinterpret_cast<int*>(*Iter);
    if( Iter == int_list.end() )
    break; int_list.erase(Iter);
    delete pInt;
    pInt = NULL;

    }