C++ 표준에 의하면 list::erase(it) 함수를 호출한 후에는 it가 무효화됩니다. 무효화된 iterator 는 더 이상 "사용"하면 안됩니다.
- 23번째 줄 및 35번째 줄에서 it를 temp에 보관함
- 25번째 줄 또는 37번째 줄이 실행되지 않았다고 가정하겠습니다
- 27번째 줄 및 39번째 줄에서 erase(it) 를 호출 (이 때 it가 무효화되며, it와 같은 값을 가졌던 temp도 동시에 무효화됨)
- 29번째 줄 및 36번째줄 에서 무효화된 temp 를 사용하려고 시도함
-> "무효화된 iterator를 사용하면 안된다" 라는 규칙을 어겼으므로 이 프로그램의 결과는 정의되지 않았습니다. (기술적으로는 Undefined Behavior 라고 부릅니다)
erase 함수는 삭제 후 삭제된 element의 "바로 다음" element를 가리키는 iterator를 반환합니다. (단, 삭제된 element가 가장 마지막 element였을 경우 end() 를 반환함). 이 반환값을 이용하면 temp 없이도 올바른 프로그램을 작성할 수 있을 겁니다.
beyondshadow 6년 전