列表迭代器不可递增
List iterator is not incrementable
我对 C++ 有点生疏,正在重新使用它以变得更好。我在 Whosebug 上搜索了一下已经无济于事。我遇到的问题是“列表迭代器不可递增”。下面是我认为是罪魁祸首的部分,因为这是我使用带有修饰符的迭代器的唯一位置。
if (!io_queue.empty()) {
for (list<Process>::iterator it = io_queue.begin(); it != io_queue.end(); ++it) {
if (it->isBurstDone()) {
if (it->isComplete()) {
it->setExit(clock);
complete.push_back(*it);
it = io_queue.erase(it);
}
else {
ready_queue.push_back(*it);
it = io_queue.erase(it);
}
}
else {
it->decBurst();
}
}
}
您在每次循环迭代中无条件递增 it
。但是当 erase()
被调用时,它 returns 一个新的迭代器指向被删除的列表元素之后的下一个元素,因此如果这导致 it
被设置为 end
迭代器而不是再次递增 it
是 未定义的行为.
只需将 ++it
从 for
语句移动到循环内的 else
块。
试试这个:
if (!io_queue.empty()) {
list<Process>::iterator it = io_queue.begin();
do {
if (it->isBurstDone()) {
if (it->isComplete()) {
it->setExit(clock);
complete.push_back(*it);
}
else {
ready_queue.push_back(*it);
}
it = io_queue.erase(it);
}
else {
it->decBurst();
++it; // <— moved here
}
}
while (it != io_queue.end());
}
我对 C++ 有点生疏,正在重新使用它以变得更好。我在 Whosebug 上搜索了一下已经无济于事。我遇到的问题是“列表迭代器不可递增”。下面是我认为是罪魁祸首的部分,因为这是我使用带有修饰符的迭代器的唯一位置。
if (!io_queue.empty()) {
for (list<Process>::iterator it = io_queue.begin(); it != io_queue.end(); ++it) {
if (it->isBurstDone()) {
if (it->isComplete()) {
it->setExit(clock);
complete.push_back(*it);
it = io_queue.erase(it);
}
else {
ready_queue.push_back(*it);
it = io_queue.erase(it);
}
}
else {
it->decBurst();
}
}
}
您在每次循环迭代中无条件递增 it
。但是当 erase()
被调用时,它 returns 一个新的迭代器指向被删除的列表元素之后的下一个元素,因此如果这导致 it
被设置为 end
迭代器而不是再次递增 it
是 未定义的行为.
只需将 ++it
从 for
语句移动到循环内的 else
块。
试试这个:
if (!io_queue.empty()) {
list<Process>::iterator it = io_queue.begin();
do {
if (it->isBurstDone()) {
if (it->isComplete()) {
it->setExit(clock);
complete.push_back(*it);
}
else {
ready_queue.push_back(*it);
}
it = io_queue.erase(it);
}
else {
it->decBurst();
++it; // <— moved here
}
}
while (it != io_queue.end());
}