공간 기억 부류

Jaemyeong Lee·2024년 8월 9일
0

FastCampusC++

목록 보기
50/78

C++의 공간 기억 부류(Storage Class) 분석

C++에서 변수의 공간 기억 부류(Storage Class)는 변수의 수명범위를 결정합니다. 이 코드 예제에서는 자동 변수, 정적 변수, 동적 메모리 할당 등 다양한 기억 부류를 사용한 예제를 보여주고 있습니다. 주석을 포함한 코드의 한 줄 한 줄을 분석하여 C++의 기억 부류에 대해 자세히 설명하겠습니다.

1. 자동 변수와 정적 변수

int main()
{
    {
        // 자동 변수, 블록을 벗어나면 해제됨, 블록에 들어올 때마다 초기화
        int num0;

        // 정적 변수, 블록을 벗어나도 해제가 되지 않음. 프로그램 종료 시 해제, 단 한 번 초기화
        static int num1;
    }
  • int num0;: num0자동 변수(Automatic Variable)로, 블록 내에서 선언된 로컬 변수입니다.

    • 이 변수는 해당 블록에 진입할 때 생성되고, 블록을 벗어나면 자동으로 해제됩니다.
    • 자동 변수는 스택 메모리에 할당되며, 블록에 진입할 때마다 초기화됩니다.
  • static int num1;: num1정적 변수(Static Variable)로, 해당 블록 내에서 선언되었지만, 블록을 벗어나도 해제되지 않습니다.

    • 이 변수는 프로그램이 종료될 때까지 메모리에 남아 있으며, 단 한 번만 초기화됩니다.
    • 정적 변수는 전역 메모리 영역(데이터 세그먼트)에 할당됩니다. 초기화는 프로그램 실행 중 처음으로 해당 블록에 진입할 때 이루어집니다.

2. 정적 변수의 유지와 자동 변수의 재초기화

    {
        for (int i = 0; i < 10; ++i)
        {
            int num0 = 0;
            ++num0;
            cout << num0 << endl; // 1

            static int num1 = 0;
            ++num1;
            cout << num1 << endl; // 계속 증가
        }
    }
  • for 루프 내에서 num0num1의 선언:

    • int num0 = 0;: num0은 매 반복마다 다시 초기화되며, ++num0 연산 후 값이 1이 됩니다. 이 값은 매번 동일하게 출력됩니다.
    • static int num1 = 0;: num1은 처음 루프에 진입할 때 한 번만 초기화됩니다. 이후 루프를 반복할 때마다 ++num1이 호출되어 값이 계속 증가합니다. 이 값은 매번 더 큰 값으로 출력됩니다.
  • 출력 결과:

    • num0은 매번 1이 출력됩니다.
    • num1은 루프를 돌 때마다 증가하여 1, 2, 3, ... 10과 같이 출력됩니다. 이는 정적 변수가 프로그램 종료 시까지 값이 유지된다는 것을 보여줍니다.

3. 동적 메모리 할당과 수동 해제

    {
        // 동적 공간, 이름이 없다
        int *p = new int;
        delete p; // 수동으로 해제야 함
        
        // 해당 블록이 벗어날 때 p 자체는 해제가 되지만 p가 가리키는 *p는 해제 되지 않는다.
    }
}
  • int *p = new int;: new 연산자를 사용해 힙(heap) 메모리에서 정수를 위한 동적 공간을 할당합니다.

    • 이 메모리에는 이름이 없으며, 포인터 p를 통해 접근할 수 있습니다.
    • 동적 메모리는 힙 메모리에 할당되며, 프로그래머가 수동으로 관리해야 합니다.
  • delete p;: 동적 할당된 메모리를 해제합니다.

    • deletenew로 할당된 메모리를 반환하며, 해제되지 않으면 메모리 누수가 발생할 수 있습니다.
    • 주의해야 할 점은 포인터 p 자체는 스택 메모리에서 관리되며, 블록을 벗어나면 자동으로 해제됩니다. 그러나 p가 가리키는 힙 메모리는 delete를 사용해 수동으로 해제해야 합니다.
  • 블록을 벗어날 때:

    • 포인터 p는 자동 변수로서 스택에서 해제됩니다. 그러나 만약 delete p;가 호출되지 않았다면, *p가 가리키는 힙 메모리는 해제되지 않고 남아 있을 수 있습니다. 이는 메모리 누수를 초래할 수 있으므로, 동적 메모리는 항상 적절하게 해제되어야 합니다.

주요 포인트 정리

  1. 자동 변수(Automatic Variable):

    • 자동 변수는 스택에 할당되며, 블록 범위를 벗어나면 자동으로 해제됩니다.
    • 블록에 진입할 때마다 새로 초기화됩니다.
  2. 정적 변수(Static Variable):

    • 정적 변수는 한 번만 초기화되며, 프로그램 종료 시까지 메모리에 남아 있습니다.
    • 정적 변수는 전역 메모리 영역에 할당됩니다.
  3. 동적 메모리 할당(Dynamic Memory Allocation):

    • new 연산자를 통해 힙에서 메모리를 동적으로 할당할 수 있으며, 이 메모리는 이름이 없습니다.
    • 동적 메모리는 프로그래머가 delete를 통해 수동으로 해제해야 하며, 그렇지 않으면 메모리 누수가 발생할 수 있습니다.
profile
李家네_공부방

0개의 댓글