본문 바로가기
Dev Language/Modern C++ (C++11, 14)

C++ 11 : nullptr

by 미티치 2020. 8. 8.

C++ 11에 nullptr은 왜 등장했을까?
NULL은 사실 integer 0이다. NULL의 선언을 찾아보면 #define NULL 0L 이다. 
사실 nullptr을 사용하는 것이 컴파일러 버전에 따라 의미가 있을 수도 있고 없을 수도 있기 때문에 포인터 변수의 경우 NULL 대신 nullptr을 사용하라고 강제할 순 없지만, 그럼에도 불구하고 nullptr을 사용하는 습관을 들이는 것이 좋다.

포인터 변수를 선언할 때 될 수 있으면 nullptr 로 초기화해주는 것이 좋다. 그래야 나중에 쓰레기 값으로 인한 런타임 메모리 오류*를 사전에 방지할 수 있다. 참고로, 포인터로 인해 발생하는 오류는 디버깅도 힘들다.

* 포인터는 초기화를 하지 않아도 되고 중간에 가리키는 변수의 주소를 변경할 수 있으므로 쓰레기 값이 저장될 수 있음

 

한 가지 더 설명하자면, 이건 처음 필자가 nullptr 을 접했을 때 '새로 할당한 메모리 포인터를 nullptr로 체크하라고 나온건가보다!' 라는 생각을 했었는데, 사실 이 부분은 크게 의미가 없다고 생각한다.

예를 들면 아래와 같다.

MyObject * pObj = new MyObject;
if( nullptr != pObj )	// if(NULL != pObj)
{
	...
 }

위의 소스처럼 new로 할당한 객체 포인터를 NULL로 체크할지, nullptr로 체크할지는 사실 의미가 없다.
new 연산자는 내부에서 메모리가 부족하면 bad alloc exception을 발생하기 때문에 try catch로 잡는게 맞는거지, 
사실 위에처럼 포인터변수를 nullptr로 비교할지 NULL로 비교할지는 의미가 없다.

그럼에도 불구하고 이렇게 사용하는 이유는 
사실은 개발자들의 관습처럼 내려오는 코딩 스타일이기도 하고, 저렇게 포인터 변수를 체크해서 개발자의 의도를 소스 코드에 나타내고자 하는 의미적인 부분이 크다. 
즉, 실효성을 따지면 실효성은 없지만 의미적인 소스 코드라고 생각하면 된다.