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

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

또는

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

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

의외로 잘 모르고 있는 부분이지만 freedelete에는 널 포인터를 집어 넣어도 아무런 문제가 없이 작동한다.
(아무 짓도 하지 않는다)

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

free(p);
p = NULL;

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

cppcheck 같은 정적분석 도구를 사용하면 이런 코드를 만났을 때 쓸데없는 짓 하지 말라고 경고 해주기도 한다.