j2013yk   2년 전

//이 부분을 처음에는 if(!l.empty())라고 풀었는데 그 때는 런타임 double free 오류가 났었는데 왜 오류가 나는지 이해가 되질 않습니다..

코드에 적겠습니다.

bupjae   2년 전

l 이 비어있는지의 여부와 관계없이 now 가 l.begin() 위치에 있었다면 --now 의 실행 결과는 예측할 수 없습니다. (Undefined Behavior)

대부분 런타임 에러가 발생하지만, 무한 루프에 빠져 시간 초과 결과를 받을 수도 있고, 전혀 엉뚱한 값을 계산할 수도 있고, 심지어 아주 우연히 맞았습니다 결과를 받을 수도 있습니다.

   

이 이후는 내부 구현에 관한 이야기입니다. 다른 컴파일러, 심지어 같은 컴파일러라도 컴파일 옵션이 다르면 전혀 다른 결과를 받을 수 있습니다.

DoubleFree 런타임 에러는 보통 이미 할당 해제한 메모리 영역을 또 다시 할당 해제하려고 할 때 발생하는 오류입니다.

다만, 애당초 할당받은 적이 없는 메모리 영역을 할당 해제하려고 할 때에도 발생할 수 있습니다.

now 가 l.begin() 위치에 있었다면, --now 연산에 의해 now 는 할당받은 적이 없는 잘못된 메모리 주소를 가리키게 됩니다.

그 후 erase 연산이 now 가 가리키고 있는 메모리 영역을 할당 해제하려고 시도하기 때문에, DoubleFree 런타임 에러가 발생했을 겁니다.

j2013yk   2년 전

답변 감사합니다.. 만.. 

설명하신 코드 부분은 now가 l.begin()이 아닐 때에만 --now가 실행되도록 예외처리가 되어 있습니다.. 

위 부분이 if(!l.empty())일 때만 double free 오류가 납니다.

bupjae   2년 전

34번째 줄의 내용이 if(now!=l.begin()) 일때는 문제가 없는게 맞습니다.

그런데 질문의 내용이 "34번째 줄이 if(!l.empty()) 일때 런타임 에러가 나는 이유" 를 물어보셨던 거 아니었나요?


j2013yk   2년 전

아 제가 멍청했네요 감사합니다.

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