더북(TheBook)

이전 컴파일러에서는 다음과 같이 설정해야 한다.

int* ip3 = 0;         // C++11 이상에서는 좋지 않은 방법
int* ip4 = NULL;      // 이하 동문

C++11 주소 값 0은 애플리케이션에서 절대 사용하지 않으므로 포인터가 비어 있다는 것을 나타내는 안전한 방법이다(무언가를 참조하지 않는다). 그럼에도 불구하고 리터럴 0은 의도를 명확하게 전달하지 않기 때문에 함수 오버로딩에서 모호함을 유발할 수 있다. NULL 매크로는 좋지 않다. 단지 0으로 치환할 뿐이다. C++11에서는 nullptr를 포인터 리터럴의 키워드로 사용한다. 모든 포인터 타입에 할당하거나 비교할 수 있다. 다른 타입과 혼동할 수 없고 자명하므로 다른 표기법보다 선호하는 표기법이다. 빈 괄호 목록으로 초기화해도 nullptr로 설정한다.

포인터의 가장 큰 위험은 메모리 누수다. 예를 들어 배열 y가 너무 작아서 새로운 배열을 할당하고 싶다고 하자.

int* y = new int[15];

이제 y에 더 많은 공간을 사용할 수 있다. 좋다. 하지만 우리가 할당했던 메모리는 어떻게 된 것인가? 여전히 그곳에 있지만, 더는 접근할 수 없다. 그 메모리를 해제하려면 주소가 필요하기 때문에 해제할 수도 없다. 이 메모리는 프로그램의 나머지 부분을 실행하면서 손실된다. 프로그램이 종료된 후에만 해당 메모리를 해제할 수 있다. 이 예에서는 몇 기가바이트 중 40바이트밖에 손실되지 않았다. 그러나 이것이 반복적인 과정에서 발생한다면 사용하지 않는 메모리는 (가상) 메모리가 모두 소모될 때까지 계속 증가할 것이다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.