Vikram Ranabhatt
Vikram Ranabhatt

Reputation: 7620

Problem in erasing element in list

struct ScheduleTaskInfo
{
unsigned int nTaskID;
   __time64_t timeStartTime;
__time64_t timeEndTime; 
};

typedef list<ScheduleTaskInfo> SchedulerList;   

SchedulerList::iterator itrSchedulerList;    
for(itrSchedulerList = gSchedulerList.begin();itrSchedulerList != gSchedulerList.end();itrSchedulerList++)
{
    SYSTEMTIME st;
    GetLocalTime(&st);

    CTime ctSyatemTime(st);

    if (itrSchedulerList->timeEndTime == ctSyatemTime.GetTime())
    {

        itrSchedulerList = gSchedulerList.erase(itrSchedulerList);          
    }

}

I am doing this it is crashing in for loop.I think it is due to erase(); Am I doing something wrong here??Please suggest me on this

Upvotes: 1

Views: 67

Answers (2)

Sarfaraz Nawaz
Sarfaraz Nawaz

Reputation: 361442

You should write itrSchedulerList++ in else-block as:

for(itrSchedulerList = gSchedulerList.begin();
                     itrSchedulerList !=gSchedulerList.end();)
{
    SYSTEMTIME st;
    GetLocalTime(&st);

    CTime ctSyatemTime(st);

    if (itrSchedulerList->timeEndTime == ctSyatemTime.GetTime())
    {

        itrSchedulerList = gSchedulerList.erase(itrSchedulerList);          
    }
    else
        itrSchedulerList++;
}

This ensures that you don't increment it beyond end of the list. erase() might return end iterator which will be incremented in the for loop in your version.

Upvotes: 6

Xeo
Xeo

Reputation: 131799

You shall not increment the iterator when you reassign it to the return of erase, as you'll effectively skip one element. Put it in an extra else block:

if (itrSchedulerList->timeEndTime == ctSyatemTime.GetTime())
{

    itrSchedulerList = gSchedulerList.erase(itrSchedulerList);          
}
else
{
  ++itrSchedulerList;
}

And take it out of the for-loop.

Upvotes: 2

Related Questions