nullptr

Jaemyeong Lee·2024년 8월 7일
0

FastCampusC++

목록 보기
34/78

C++ 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;
}

1. nullptr로 포인터 초기화

첫 번째 블록에서는 포인터를 nullptr로 초기화하는 방법을 보여줍니다.

{
    int* p = nullptr; // 포인터 p를 nullptr로 초기화 (비어있는 포인터)
    cout << p << endl; // 포인터 p의 값 출력 (0 또는 NULL 출력)
}
  • nullptr은 포인터가 어떤 유효한 메모리 주소도 가리키지 않음을 명확하게 나타냅니다.
  • nullptr을 사용하면 초기화되지 않은 포인터로 인해 발생할 수 있는 문제를 방지할 수 있습니다.

2. 동적 할당 후 해제 및 nullptr로 초기화

두 번째 블록에서는 동적 할당 후 포인터를 해제하고 nullptr로 초기화하는 방법을 다룹니다.

{
    int* p = new int; // 동적으로 정수형 메모리 할당
    delete p; // 할당된 메모리 해제
    p = nullptr; // 해제한 이후 포인터를 nullptr로 초기화

    // 포인터가 유효한지 확인
    if (p != nullptr) // p가 nullptr가 아니면
    {
        // 여기에 유효한 포인터일 때의 코드 작성
    }
}
  • 동적 할당된 메모리를 해제한 후 포인터를 nullptr로 초기화하여, 해제된 메모리를 다시 참조하는 오류를 방지할 수 있습니다.
  • nullptr로 초기화된 포인터는 조건문에서 유효성을 쉽게 검사할 수 있습니다.

3. C++11 이전의 NULL

세 번째 블록에서는 C++11 이전의 NULL 사용과 nullptr 사용의 차이를 보여줍니다.

{
    // C++11 이전에는 NULL을 사용하여 함수 호출
    func(NULL); // NULL은 정수형 0으로 간주되어 함수 호출 가능

    // 호출되지 않음 (컴파일 오류 발생)
    // func(nullptr); // nullptr은 포인터 타입이므로 int 매개변수를 받는 함수와 일치하지 않음
}
  • NULL은 정수형 0으로 간주되어, 정수 매개변수를 받는 함수 호출에 사용할 수 있습니다.
  • nullptr은 명확한 포인터 타입을 가지므로, 포인터와 정수 매개변수를 구분할 수 있습니다.

4. nullptr의 타입

네 번째 블록에서는 nullptr의 타입과 그 특성을 살펴봅니다.

{
    std::nullptr_t n = nullptr; // nullptr_t 타입의 변수 n을 nullptr로 초기화

    // nullptr_t 타입은 어떤 형태의 포인터로도 변환 가능
    int* p = n; // nullptr_t 타입의 n을 정수형 포인터 p로 변환
}
  • nullptrstd::nullptr_t 타입을 가지며, 이는 모든 포인터 타입으로 변환될 수 있습니다.
  • nullptr_t 타입을 사용하면 코드의 가독성과 안정성을 높일 수 있습니다.
profile
李家네_공부방

0개의 댓글