在我们使用STL提供的list容器时,常常需要遍历链表,删除符合条件的节点,这样会出现一个危险,见下面: #include <iostream> #include <list> using namespace std; int main() { list<int> l; int erase_number = 1; int length = 5; for ( int i = 0; i < length ; i++ ) { l.push_back( erase_number ); } // 假设erase_number为我们要删除的节点,遍历链表将符合条件的erase掉 for ( list<int>::iterator it = l.begin() ; it != l.end() ; it++ ) { if ( *it == erase_number ) { l.erase( it ); // 危险做法,当l删除it指向的节点后,it++尝试指向原来的下一个节点,无法正常运行 // 单步调试,程序将在这里异常结束 } } return 0; } 一个处理办法为: #include <iostream> #include <list> using namespace std; int main() { list<int> l; int erase_number = 1; int length = 5; for ( int i = 0; i < length ; i++ ) { l.push_back( erase_number ); } for ( list<int>::iterator it = l.begin() ; it != l.end() ; ) { if ( *it == erase_number ) { l.erase( it ); it = l.begin(); // 删除it指向的节点后,it又指向list的头 // 这样做会损失效率,但是不会出现指针异常的错误 } else { it++; } } return 0; } 若有更好的做法,请各位大神指教!