l 이 비어있는지의 여부와 관계없이 now 가 l.begin() 위치에 있었다면 --now 의 실행 결과는 예측할 수 없습니다. (Undefined Behavior)
대부분 런타임 에러가 발생하지만, 무한 루프에 빠져 시간 초과 결과를 받을 수도 있고, 전혀 엉뚱한 값을 계산할 수도 있고, 심지어 아주 우연히 맞았습니다 결과를 받을 수도 있습니다.
이 이후는 내부 구현에 관한 이야기입니다. 다른 컴파일러, 심지어 같은 컴파일러라도 컴파일 옵션이 다르면 전혀 다른 결과를 받을 수 있습니다.
DoubleFree 런타임 에러는 보통 이미 할당 해제한 메모리 영역을 또 다시 할당 해제하려고 할 때 발생하는 오류입니다.
다만, 애당초 할당받은 적이 없는 메모리 영역을 할당 해제하려고 할 때에도 발생할 수 있습니다.
now 가 l.begin() 위치에 있었다면, --now 연산에 의해 now 는 할당받은 적이 없는 잘못된 메모리 주소를 가리키게 됩니다.
그 후 erase 연산이 now 가 가리키고 있는 메모리 영역을 할당 해제하려고 시도하기 때문에, DoubleFree 런타임 에러가 발생했을 겁니다.
j2013yk 2년 전
//이 부분을 처음에는 if(!l.empty())라고 풀었는데 그 때는 런타임 double free 오류가 났었는데 왜 오류가 나는지 이해가 되질 않습니다..
코드에 적겠습니다.