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);
}
}
我正在这样做它正在崩溃for循环。我认为这是由于erase(); 我在这里做错了吗?请在此建议我
答案 0 :(得分:6)
您应该在itrSchedulerList++
中将else-block
写为:
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++;
}
这可确保您不会将其增加到列表的末尾。 erase()
可能会返回结束迭代器,它将在您的版本的for
循环中递增。
答案 1 :(得分:2)
当你将迭代器重新分配给erase
的返回时,你不应该增加迭代器,因为你将有效地跳过一个元素。把它放在一个额外的else
块中:
if (itrSchedulerList->timeEndTime == ctSyatemTime.GetTime())
{
itrSchedulerList = gSchedulerList.erase(itrSchedulerList);
}
else
{
++itrSchedulerList;
}
将其从for-loop中取出。