반응형
출처:
http://stackoverflow.com/questions/8717225/fclose-causing-segmentation-fault
fclose() 함수에서 segmentation fault 오류가 나서 검색하면서 다음과 같은 걸 알게 되었다.
1. fopen() 함수에서 오류가 났을 시 fclose()를 불러 줘야 하는가.
나는 운이 좋았는지 fopen() 에서 오류가 나지는 않았다.
그런데 찾아보니 fopen()에서 오류, 즉 NULL을 반환했다면 fclose()를 불러줄 필요가 없다고 한다.
사실 불러줄 필요가 없다기 보다는, 불러서 오류가 날 가능성이 더 커보이긴 하다.
NULL을 리턴했는데 그 NULL로 다시 뭔가를 하려고 한다는 자체가 더 위험한 발상이니...
가만 생각해보면 당연한 것임에도 종종 그런 걸 놓치는 거 같다.
여튼 코드는 그래서 fopen()이 파일 디스크립터를 반환할 때만 불러주게끔 수정하였다.
2. fclose()에서 segmentation fault 오류
솔직히 조금 뜬금없는 오류라서 당황했는데, 역시나 검색 결과도 그랬다.
두 번째 링크를 읽어보니 함수 스택이 오염되었을 가능성이 높다고 적혀있었다.
그래서 나도 다른 걸 고치다보니 자연스럽게 fclose()에서의 segmentation fault 오류도 사라졌다.
반응형