C++에서 변수의 공간 기억 부류(Storage Class)는 변수의 수명과 범위를 결정합니다. 이 코드 예제에서는 자동 변수, 정적 변수, 동적 메모리 할당 등 다양한 기억 부류를 사용한 예제를 보여주고 있습니다. 주석을 포함한 코드의 한 줄 한 줄을 분석하여 C++의 기억 부류에 대해 자세히 설명하겠습니다.
int main()
{
{
// 자동 변수, 블록을 벗어나면 해제됨, 블록에 들어올 때마다 초기화
int num0;
// 정적 변수, 블록을 벗어나도 해제가 되지 않음. 프로그램 종료 시 해제, 단 한 번 초기화
static int num1;
}
int num0;
: num0
은 자동 변수(Automatic Variable)로, 블록 내에서 선언된 로컬 변수입니다.
static int num1;
: num1
은 정적 변수(Static Variable)로, 해당 블록 내에서 선언되었지만, 블록을 벗어나도 해제되지 않습니다.
{
for (int i = 0; i < 10; ++i)
{
int num0 = 0;
++num0;
cout << num0 << endl; // 1
static int num1 = 0;
++num1;
cout << num1 << endl; // 계속 증가
}
}
for
루프 내에서 num0
과 num1
의 선언:
int num0 = 0;
: num0
은 매 반복마다 다시 초기화되며, ++num0
연산 후 값이 1
이 됩니다. 이 값은 매번 동일하게 출력됩니다.static int num1 = 0;
: num1
은 처음 루프에 진입할 때 한 번만 초기화됩니다. 이후 루프를 반복할 때마다 ++num1
이 호출되어 값이 계속 증가합니다. 이 값은 매번 더 큰 값으로 출력됩니다.출력 결과:
num0
은 매번 1
이 출력됩니다.num1
은 루프를 돌 때마다 증가하여 1, 2, 3, ... 10
과 같이 출력됩니다. 이는 정적 변수가 프로그램 종료 시까지 값이 유지된다는 것을 보여줍니다. {
// 동적 공간, 이름이 없다
int *p = new int;
delete p; // 수동으로 해제야 함
// 해당 블록이 벗어날 때 p 자체는 해제가 되지만 p가 가리키는 *p는 해제 되지 않는다.
}
}
int *p = new int;
: new
연산자를 사용해 힙(heap) 메모리에서 정수를 위한 동적 공간을 할당합니다.
p
를 통해 접근할 수 있습니다.delete p;
: 동적 할당된 메모리를 해제합니다.
delete
는 new
로 할당된 메모리를 반환하며, 해제되지 않으면 메모리 누수가 발생할 수 있습니다.p
자체는 스택 메모리에서 관리되며, 블록을 벗어나면 자동으로 해제됩니다. 그러나 p
가 가리키는 힙 메모리는 delete
를 사용해 수동으로 해제해야 합니다.블록을 벗어날 때:
p
는 자동 변수로서 스택에서 해제됩니다. 그러나 만약 delete p;
가 호출되지 않았다면, *p
가 가리키는 힙 메모리는 해제되지 않고 남아 있을 수 있습니다. 이는 메모리 누수를 초래할 수 있으므로, 동적 메모리는 항상 적절하게 해제되어야 합니다.자동 변수(Automatic Variable):
정적 변수(Static Variable):
동적 메모리 할당(Dynamic Memory Allocation):
new
연산자를 통해 힙에서 메모리를 동적으로 할당할 수 있으며, 이 메모리는 이름이 없습니다.delete
를 통해 수동으로 해제해야 하며, 그렇지 않으면 메모리 누수가 발생할 수 있습니다.