beyondshadow   7년 전

컴퓨터에서 나름대로 테스트 케이스도 만들어서 돌려보고 잘 되는 거 확인도 했는데, 막상 채점하려고 제출하니 런타임 오류라고만 나오고 다른 설명이 없으니 무엇이 문제인 건지 잘 못 찾겠네요 ㅠㅠ 이 문제는 어떤 식으로 해결해야할까요? 그리고 혹시 런타임 오류 뜨면 어떤 식으로 해결하시는지도 좀 알 수 있을까요?? 

bupjae   7년 전

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   7년 전

감사합니다! erase 함수를 잘 알지도 못하면서 쓰는 게 문제였군요. 하루 종일 고민했는데 뭔가 시원해지는 것 같습니다. 다시 해보겠습니다. 

댓글을 작성하려면 로그인해야 합니다.