C/C++에서 delete 전에 NULL 포인터를 검사하는 이유
결론부터 말하자면, delete를 호출하기 전에 포인터가 NULL인지 검사하는 것은 대부분의 경우 불필요합니다.
C++ 표준은 NULL(또는 nullptr)로 설정된 포인터에 대해 delete를 수행하면 아무런 동작도 하지 않도록(no-op) 보장합니다. 즉, 널 포인터를 삭제해도 프로그램이 비정상 종료되거나 메모리가 손상되지 않으므로, 별도의 널 검사 없이도 안전하게 호출할 수 있습니다.
그렇다면 왜 널 검사 코드를 작성할까?
그럼에도 일부 개발자가 delete 전에 널 검사를 수행하는 이유는, 이미 NULL로 설정된 포인터를 삭제하려는 시도 자체가 프로그램 어딘가에 논리적 버그가 존재한다는 신호일 수 있기 때문입니다. 특정 시점에 포인터가 널이라는 사실은 곧 '왜 이 시점에 포인터가 유효하지 않은가?'라는 의문으로 이어지며, 이를 통해 잠재적인 설계 오류나 잘못된 실행 흐름을 조기에 발견할 수 있습니다.
실무에서 권장되는 접근 방식
delete호출 직후에는 포인터를nullptr로 초기화하여 댕글링 포인터(dangling pointer)를 예방합니다.- 아무 효과가 없는 불필요한 널 검사는 코드 가독성만 떨어뜨리므로 제거하는 것이 좋습니다.
- 현대 C++에서는
std::unique_ptr,std::shared_ptr같은 스마트 포인터를 활용해 수동 메모리 관리 자체를 최소화하는 것이 바람직합니다.
정리하자면, 널 포인터에 대한 delete는 표준적으로 안전하지만, 그러한 상황이 발생했다는 사실 자체가 숨겨진 버그의 단서일 수 있으므로 코드의 근본 원인을 함께 점검하는 습관이 중요합니다.