메모리를 해제하기 전에 왜 널 체크를 하는걸까?
2011. 5. 29. 21:24 |
Programming
결론부터 이야기 하면 널 체크는 할 필요가 없다.
if (p)
{
free(p);
p = NULL;
}
또는
if (p)
{
delete p;
p = 0;
}
{
free(p);
p = NULL;
}
또는
if (p)
{
delete p;
p = 0;
}
이렇게 메모리를 해제하기 전에 널 포인터인지 체크하는 코드를 수도 없이 많이 보았다.
아마도 이미 해제한 메모리를 또 해제 하다가 프로그램이 죽지 않게 하기 위해서 일 것이다.
그런데 free나 delete에는 널 포인터를 집어 넣어도 아무런 문제가 없이 작동한다. -아무 짓도 하지 않는다.
생각보다 많은 사람들이 잘 모르고 있는 부분이다.
위 코드는 다음처럼만 써주어도 된다.
free(p);
p = NULL;
p = NULL;
해제 후에 0을 넣어주는 것도 많은 경우에는 필요가 없지만(지역 변수의 포인터를 해제하는 경우) 이후에 언제라도 다시 해제를 시도할 가능성이 있을 때는 써주는 것이 의미가 있다.
cppcheck 같은 정적분석 도구를 사용할 시에는 맨 위의 널 포인터를 체크하는 코드를 보면 성능이 떨어진다면서 저런 짓을 할 필요 없다고 경고해주기도 한다.
'Programming' 카테고리의 다른 글
레지스트리의 volatile 옵션 (0) | 2011.09.27 |
---|---|
알아두면 유용한 MoveFileEx 함수의 펜딩 옵션 (0) | 2011.07.17 |
메모리를 해제하기 전에 왜 널 체크를 하는걸까? (6) | 2011.05.29 |
윈도우 드라이버를 만들 때 알아야 할 기초적인 내용들 (2) | 2011.05.23 |
Duff's Device (0) | 2011.04.07 |
_countof 매크로 (0) | 2011.03.15 |
이게 너무 오랫동안 습관이 ㅎㅎ
Reply처음에 null 로 초기화 안한 변수를 delete 해서 많이들 죽여 봐서.. 저렇게 하는 게 당연하다고 생각했는데 결국 '괜한 짓' 이군요 ㅎ
크크 네 맞아요.
정말 사람의 습관이라는 것이 무서운게, 학생때 널체크로 배웠더니...
Reply나중에 초급시절을 벗어나 free(NULL)이 문제가 없는 것을 알았어도, 어느 순간 보면 기계적으로 널체크 코딩을 하고 있더군요.
네 맞습니다^^
여담이지만, 여기에 대고
Replyif (p != NULL) ...
이라고까지 써놓은 걸 보면 정말 몸이 움찔(?)하더군요.
이것은 중요합니다... ㅠㅠ...
Replyif(p != NULL)
{
free(p);
p = NULL;
}