nullptr
사용법C++11부터 도입된 nullptr
는 포인터를 명확하게 초기화할 수 있는 방법을 제공합니다. nullptr
는 기존의 NULL
과 달리 명확한 타입을 가지며, 잘못된 포인터 사용을 방지하는 데 유용합니다. 이번 포스트에서는 nullptr
의 사용법을 다양한 예제와 함께 살펴보겠습니다.
#include <iostream>
using namespace std;
void func(int n)
{
// 함수 정의
}
int main()
{
// 첫 번째 블록: `nullptr`로 포인터 초기화
{
int* p = nullptr; // 포인터 p를 nullptr로 초기화 (비어있는 포인터)
cout << p << endl; // 포인터 p의 값 출력 (0 또는 NULL 출력)
}
// 두 번째 블록: 동적 할당 후 해제 및 `nullptr`로 초기화
{
int* p = new int; // 동적으로 정수형 메모리 할당
delete p; // 할당된 메모리 해제
p = nullptr; // 해제한 이후 포인터를 nullptr로 초기화
// 포인터가 유효한지 확인
if (p != nullptr) // p가 nullptr가 아니면
{
// 여기에 유효한 포인터일 때의 코드 작성
}
}
// 세 번째 블록: C++11 이전의 NULL
{
// C++11 이전에는 NULL을 사용하여 함수 호출
func(NULL); // NULL은 정수형 0으로 간주되어 함수 호출 가능
// 호출되지 않음 (컴파일 오류 발생)
// func(nullptr); // nullptr은 포인터 타입이므로 int 매개변수를 받는 함수와 일치하지 않음
}
// 네 번째 블록: `nullptr`의 타입
{
std::nullptr_t n = nullptr; // nullptr_t 타입의 변수 n을 nullptr로 초기화
// nullptr_t 타입은 어떤 형태의 포인터로도 변환 가능
int* p = n; // nullptr_t 타입의 n을 정수형 포인터 p로 변환
}
return 0;
}
nullptr
로 포인터 초기화첫 번째 블록에서는 포인터를 nullptr
로 초기화하는 방법을 보여줍니다.
{
int* p = nullptr; // 포인터 p를 nullptr로 초기화 (비어있는 포인터)
cout << p << endl; // 포인터 p의 값 출력 (0 또는 NULL 출력)
}
nullptr
은 포인터가 어떤 유효한 메모리 주소도 가리키지 않음을 명확하게 나타냅니다.nullptr
을 사용하면 초기화되지 않은 포인터로 인해 발생할 수 있는 문제를 방지할 수 있습니다.nullptr
로 초기화두 번째 블록에서는 동적 할당 후 포인터를 해제하고 nullptr
로 초기화하는 방법을 다룹니다.
{
int* p = new int; // 동적으로 정수형 메모리 할당
delete p; // 할당된 메모리 해제
p = nullptr; // 해제한 이후 포인터를 nullptr로 초기화
// 포인터가 유효한지 확인
if (p != nullptr) // p가 nullptr가 아니면
{
// 여기에 유효한 포인터일 때의 코드 작성
}
}
nullptr
로 초기화하여, 해제된 메모리를 다시 참조하는 오류를 방지할 수 있습니다.nullptr
로 초기화된 포인터는 조건문에서 유효성을 쉽게 검사할 수 있습니다.세 번째 블록에서는 C++11 이전의 NULL
사용과 nullptr
사용의 차이를 보여줍니다.
{
// C++11 이전에는 NULL을 사용하여 함수 호출
func(NULL); // NULL은 정수형 0으로 간주되어 함수 호출 가능
// 호출되지 않음 (컴파일 오류 발생)
// func(nullptr); // nullptr은 포인터 타입이므로 int 매개변수를 받는 함수와 일치하지 않음
}
NULL
은 정수형 0으로 간주되어, 정수 매개변수를 받는 함수 호출에 사용할 수 있습니다.nullptr
은 명확한 포인터 타입을 가지므로, 포인터와 정수 매개변수를 구분할 수 있습니다.nullptr
의 타입네 번째 블록에서는 nullptr
의 타입과 그 특성을 살펴봅니다.
{
std::nullptr_t n = nullptr; // nullptr_t 타입의 변수 n을 nullptr로 초기화
// nullptr_t 타입은 어떤 형태의 포인터로도 변환 가능
int* p = n; // nullptr_t 타입의 n을 정수형 포인터 p로 변환
}
nullptr
은 std::nullptr_t
타입을 가지며, 이는 모든 포인터 타입으로 변환될 수 있습니다.nullptr_t
타입을 사용하면 코드의 가독성과 안정성을 높일 수 있습니다.