정적할당과 동적할당

2006. 4. 8. 18:43Scrapbook/개발 및 프로그래밍

반응형
우리가 프로그래밍을 할때 변수를 할당하는 메모리 영역은 크게 스택(stack) 영역과 힙(heap) 영역으로 나뉘어집니다. 스택 영역은 메모리 영역중 매우 적은 영역만을 할당받고 있으며, 나머지 대부분의 영역이 힙 영역입니다. 데이터 구조상 힙 영역이 더 큰 공간을 사용하기에 합리적이기 때문이죠. (이것에 대한 지식은 자료구조 관련 서적을 보시기 바랍니다.) C++ 코드를 예로 들어가며 설명해드리겠습니다.

int a = 73;
char string[100];
strcpy(string, "abc");
코드1. 정적할당의 예

위와 같이 일반적인 변수선언은 스택영역에 메모리를 할당해줍니다. a라는 변수는 정수형이므로 스택영역에 4바이트를, string이라는 변수는 문자형 배열 100칸이므로 1바이트*100인 100바이트를 할당해줍니다.

스택영역은 메모리 할당과 해제가 자동이므로 저렇게 선언해주시고 사용만 하시면 알아서 메모리에서 해제가 됩니다. 스택영역에는 한 번 할당하면 끝까지 할당한 형태로만 사용해야하기 때문에 정적 할당(static allocation)이라고 부르죠.

스택영역과는 달리 힙영역에 할당하는 방식을 동적 할당(dynamic allocation)이라 부릅니다. 힙영역에 메모리를 할당하는 방식은 스택영역에 포인터 변수를 할당하고 그 포인터를 사용해서 힙 영역의 임의의 공간을 가리켜서 그 가리킨 곳부터 원하는 크기만큼을 할당해 사용하는데, 이 크기를 해제하고 또 다른 크기로 재할당하는 등 변화를 줄 수 있기 때문에 동적 할당이라 부르는 것이죠. 다음 그림을 보시기 바랍니다.

동적할당받은 공간은 다른 프로그램으로부터 보호를 받습니다. 힙 영역은 모든 프로그램이 공유하는 영역이기 때문이죠. 그렇기 때문에 보호할 필요가 있는 겁니다. 때문에 동적할당받아서 사용을 한 후, 사용이 끝났으면 이 영역을 해제해주어야 합니다. 그렇지 않으면 프로그램이 종료된 이후에도 보호된 상태로 남아있기 때문에 시스템이 이상한 현상을 보일 수도 있습니다. 다음은 정적할당하는 방법과 해제하는 방법입니다.

int* a = (int*)malloc( sizeof(int) );
char* string = (char*)malloc( sizeof(char) * 100 );
strcpy(string, "abc");

free( a );
free( string );
코드2. 동적할당의 예1 ~ C 컴파일러의 경우

int* a = new int;
char* string = new char[100];
strcpy(string, "abc");

delete a;
delete [] string;
코드3. 동적할당의 예2 ~ C++ 컴파일러의 경우

C++ 컴파일러는 기본적으로 동적할당/해제 연산자인 new와 delete를 제공하지만 C에서는 그렇지 않기 때문에 malloc()과 free()라는 함수를 사용해야 합니다. 하지만 요즘은 C 전용 컴파일러만 있는 경우는 거의 드물기 때문에 C++ 컴파일러를 기준으로 설명하겠습니다.

[출처: 별나라 네트]

반응형