본문 바로가기
지식 정리

c++에서의 NULL과 nullptr

by Unagi_zoso 2022. 4. 29.

 

 

c++에서의 c와는 조금 다르게 Null정수의 0으로만 정의하며(MACRO를 통해) 

사용하기에 유효하지 않은 메모리의 0번지에 접근하게합니다.

그렇게 함으로 NULL 포인터 상수를 다룹니다.

 

c++11미만의 경우 : int 0으로 평가되는 rvalue

c++11이상의 경우 : 정수 리터럴 0, std::nullptr_t 타입의 prvalue

 

 

 

 

앞서 c와는 조금 다르다 하였는데 c는 (void*)0의 방식도 사용합니다.

이 방식은 (void*)의 특성상 여러 포인터로 변환이 가능하기에

이를 위험하다 판단하여 c++에서는 c++ c와의 호환을 위해서

0만을 MACRO를 통해 정의해 NULL 포인터 상수를 다룹니다.

(정보출처 : https://stackoverflow.com/a/69057243/18325764)

 

 

<stddef.h>.

 

 

 

 

이렇게 c++은 정수형 0을 NULL 포인터 상수로 다루기에

다음과 같은 함수의 오버로딩에서 모호함의 문제가 나타날 수 있습니다.

 

 

 

 

0이 내부적으로 정수의 역할과 포인터 상수로써 두 역할을 하는 셈입니다.

 

 

 

 

nullptr의 도입

 

 

그래서 이러한 문제를 해결하기 위해 C++11 부터는 nullptr이 도입되었습니다.

 

 

nullptr 포인터 리터럴로  기존의 NULL과는 다르게 0과 구분됩니다.

 

 

nullptr은 std::nullptr_t이라는 타입을 가지며

여러 포인터로 암시적 형변환이 가능합니다.

(위에서는 이러한 방식이 위험하여 0으로만 NULL을 다룬다 하였는데 

이는 수용하기로 한 것 같다고 조심스럽게 생각한다.)

 

 

 

 

그리고 nullptr을 사용함으로 그 목적이 뚜렷해 안전하게 쓸 수 있으며 가독성에도 이롭다.

 

 

 

 

 

 

 

아직 여러 라이브러리에서는 NULL이 많이 보이고 nullptr도 같이 쓰이지만

modern c++관점에서는 nullptr을 사용하는 것이 더욱 바람직하다고 본다.

 

 

 

읽어봐 주셔서 감사합니다. 부족한 부분은 사소한 부분이더라도 알려주시면 감사하겠습니다.

 

댓글