Community

개발자 99% 커뮤니티에서 수다 떨어요!

← Go back
Mission: 연습문제 풀이!
#pragmatic
2년 전
550

TIL (Today I Learned) 날짜

2022.05.23

연습 문제 17. 일부 C나 C++ 개발자들은 어떤 포인터가 가리키는 메모리를 해제한 다음에는 반드시 그 포인터 값을 NULL로 설정한다. 왜 이것이 좋은 생각일까?

포인터가 동적이나 정적으로 할당되어 사용되고 난 후에, free() 함수를 이용하여 메모리를 해제한다. 하지만 free() 함수를 사용하였을 때 run time error가 발생할 가능성이 있다. 이때 run time error란, 이미 컴파일이 완료되어 프로그램이 실행 중임에도 불구하고, 의도치 않은 예외 상황으로 인하여 프로그램 실행 중에 발생하는 오류 형태를 의미한다. 이는 할당이 되고 난 후의 메모리가 free() 함수를 통해 메모리를 해제했음에도 포인터가 가리키는 메모리는 사용했던 메모리이기 때문에, 이후 프로그램에서 실행할 때 이 메모리를 참조하면, 그 전 포인터가 가리키는 메모리를 다시 할당하는 경우가 발생하면서 오류가 발생하는 것이다. 따라서 해당 포인터의 메모리 할당을 해제한 후 그 포인터 값을 NULL로 설정하여 오류가 발생되지 않도록 한다. 그렇게 하여 프로그램에서 포인터가 가리키는 값이 유효한 지를 판단하기 위해서는 NULL인지 아닌지 판단한다. 만약 NULL이라면, 새로운 메모리를 할당하도록 하고, 아니라면 포인터를 NULL로 만든 후 새로운 메모리를 할당하도록 하거나 이미 할당된 메모리가 있으므로 다음 작업을 하도록 하여 오류를 방지한다. 따라서 포인터가 가리키는 메모리를 해제한 다음 해당 포인터 값을 NULL로 설정하는 것은 좋은 생각이다.

참고


책에 있는 해답

대부분의 C나 C++ 구현에서는 어떤 포인터가 정말로 유효한 메모리를 가리키는지 확인할 방법이 없다. 어떤 메모리 영역의 할당을 해제한 후 나중에 프로그램에서 그 메모리를 참조하는 실수가 자주 일어난다. 그때쯤이면 포인터가 가리키는 메모리는 다른 용도로 다시 할당되었을 수도 있다. 포인터에 NULL을 지정하여 이런 잘못된 참조를 막으려는 것이다. 대부분의 구현에서 NULL 포인터를 참조하면 런타임 오류가 발생한다.