C++ 正确处理列表大小为1的std::列表擦除
考虑以下几点:C++ 正确处理列表大小为1的std::列表擦除,c++,stl,stdlist,C++,Stl,Stdlist,考虑以下几点: for (it = list.begin(); it != list.end(); ++it) { if (!(*it)->alive) { it = list.erase(it); } } 只要list.size()>1就可以了。一旦列表中只包含一个元素,则会调用erase segfaults。我假设是因为没有下一个元素。至少,这是我观察到的行为。 有没有正确的方法来处理这个问题?也许是一种完全不同的方法 正如你所看到的,我不想立即清除列
for (it = list.begin(); it != list.end(); ++it) {
if (!(*it)->alive) {
it = list.erase(it);
}
}
只要list.size()>1
就可以了。一旦列表中只包含一个元素,则会调用erase segfaults。我假设是因为没有下一个元素。至少,这是我观察到的行为。
有没有正确的方法来处理这个问题?也许是一种完全不同的方法
正如你所看到的,我不想立即清除列表。我只想在元素消亡时删除它们,这可以正常工作,直到删除最后一个元素。以下操作将正常工作:
for (it = list.begin(); it != list.end(); ) {
if (!(*it)->alive) {
it = list.erase(it);
} else {
++it;
}
}
问题不仅仅在于某些尺寸。在您的示例中,每次删除一个元素时,都会跳过一个元素。想想看
如果元素不是“活动的”,则执行以下操作:it=list.erase(它)
,它删除该元素并将其设置为其后的元素然后循环执行++it
,这会跳过下一个循环,可能会跳过end()
这不仅仅是跳过
end()
的问题,您也跳过了其他元素,但是删除列表中的最后一个元素可能会导致崩溃。以下操作将正常工作:
for (it = list.begin(); it != list.end(); ) {
if (!(*it)->alive) {
it = list.erase(it);
} else {
++it;
}
}
问题不仅仅在于某些尺寸。在您的示例中,每次删除一个元素时,都会跳过一个元素。想想看
如果元素不是“活动的”,则执行以下操作:it=list.erase(它)
,它删除该元素并将其设置为其后的元素然后循环执行++it
,这会跳过下一个循环,可能会跳过end()
这不仅仅是跳过
end()
的问题,您也跳过了其他元素,但是删除列表中的最后一个元素可能会导致崩溃。类似:顺便说一句,您这里没有内存泄漏吗?列表似乎包含指针,您可以在不删除指针的情况下删除它们。指向的对象仍然可以访问吗?指针仍然可以从另一个列表中访问。当他们死后,他们会进入死亡名单,然后在需要的时候被回收到活名单上。保存一些alloc和dealloc循环。类似:顺便说一句,这里没有内存泄漏吗?列表似乎包含指针,您可以在不删除指针的情况下删除它们。指向的对象仍然可以访问吗?指针仍然可以从另一个列表中访问。当他们死后,他们会进入死亡名单,然后在需要的时候被回收到活名单上。保存一些alloc和dealloc循环。谢谢。奇怪的是,我上面的代码在用g++编译的linux上运行,但在我家的Mac上似乎崩溃了。我需要再检查一下。但我会尝试你的解决方案,看看它是否能解决Mac上的问题。我有一种感觉,你说的“工作”是指“不会崩溃”:-。您的代码有未定义的行为,这意味着它被允许执行任何操作。此外,问题不仅在于循环结束,还在于每次删除一个元素时都会跳过一个元素。只有当您碰巧删除了最后一个时,它才会崩溃。正是:)-现在才有意义。谢谢,谢谢。奇怪的是,我上面的代码在用g++编译的linux上运行,但在我家的Mac上似乎崩溃了。我需要再检查一下。但我会尝试你的解决方案,看看它是否能解决Mac上的问题。我有一种感觉,你说的“工作”是指“不会崩溃”:-。您的代码有未定义的行为,这意味着它被允许执行任何操作。此外,问题不仅在于循环结束,还在于每次删除一个元素时都会跳过一个元素。只有当您碰巧删除了最后一个时,它才会崩溃。正是:)-现在才有意义。谢谢