Media Log

결론부터 이야기 하면 널 체크는 할 필요가 없다.

if (p)
{
free(p);
p = NULL;
}

또는
if (p)
{
delete p;
p = 0;
}

이렇게 메모리를 해제하기 전에 널 포인터인지 체크하는 코드를 수도 없이 많이 보았다.
아마도 이미 해제한 메모리를 또 해제 하다가 프로그램이 죽지 않게 하기 위해서 일 것이다.

그런데 free나 delete에는 널 포인터를 집어 넣어도 아무런 문제가 없이 작동한다. -아무 짓도 하지 않는다.
생각보다 많은 사람들이 잘 모르고 있는 부분이다.

위 코드는 다음처럼만 써주어도 된다.

free(p);
p = NULL;

해제 후에 0을 넣어주는 것도 많은 경우에는 필요가 없지만(지역 변수의 포인터를 해제하는 경우) 이후에 언제라도 다시 해제를 시도할 가능성이 있을 때는 써주는 것이 의미가 있다.

cppcheck 같은 정적분석 도구를 사용할 시에는 맨 위의 널 포인터를 체크하는 코드를 보면 성능이 떨어진다면서 저런 짓을 할 필요 없다고 경고해주기도 한다.

저작자 표시 비영리 동일 조건 변경 허락
신고
  1. Favicon of http://eslife.tistory.com BlogIcon esstory at 2011.05.30 12:58 신고 [edit/del]

    이게 너무 오랫동안 습관이 ㅎㅎ
    처음에 null 로 초기화 안한 변수를 delete 해서 많이들 죽여 봐서.. 저렇게 하는 게 당연하다고 생각했는데 결국 '괜한 짓' 이군요 ㅎ

    Reply
  2. Favicon of http://sunyzero.tistory.com BlogIcon stevenkim at 2011.07.21 00:42 신고 [edit/del]

    정말 사람의 습관이라는 것이 무서운게, 학생때 널체크로 배웠더니...

    나중에 초급시절을 벗어나 free(NULL)이 문제가 없는 것을 알았어도, 어느 순간 보면 기계적으로 널체크 코딩을 하고 있더군요.

    Reply
  3. gcd at 2012.02.22 06:43 신고 [edit/del]

    여담이지만, 여기에 대고
    if (p != NULL) ...
    이라고까지 써놓은 걸 보면 정말 몸이 움찔(?)하더군요.

    Reply
  4. Favicon of http://blog.daum.net/knightofelf BlogIcon shint at 2013.10.26 21:34 신고 [edit/del]

    이것은 중요합니다... ㅠㅠ...
    if(p != NULL)
    {
    free(p);
    p = NULL;
    }

    Reply

submit