1 minute read

동적 할당(Dynamic allocation)

동적 할당.. 상당히 자주 나오는 개념인데 생각보다 내가 정리가 명확하게 되어 있는 것 같지 않아서 다시 단단히 되짚어 보자는 느낌으로 정리 해본다.

1. 동적 할당은 언제 필요한가?

1) 일시적으로 갑자기 많은 메모리를 잡아야 할 경우

보조 기억 장치인 D드라이브, C드라이브인 경우 메모리를 1T 이상 등 크게 확보가 가능하지만 프로그램을 실행하기 위해 필요한 RAM의 메모리 자원은 한정적이다. 어떤 프로세스가 많은 메모리가 필요한데 이를 프로세스 처음부터 끝까지 잡고 있는다면 그만큼 메모리 효율성이 떨어지게 된다.

→ 사용할 때만 잠시 잡았다가 필요 없으면 해당 메모리를 해지시키고 다른 곳에서 활용할 수 있도록 하는 것이 리소스 관리에 효율적이다.

50KB이상이면 동적으로 할당해 줘야지, 아니면 crash가 발생할 위험이 있다(플랫폼에 따라 달라질 수 있음).

2) 함수 리턴 이후에도 메모리 할당이 살아있게 하고 싶을 경우

일반 변수와 함수는 stack이라는 메모리 공간에 할당되는데, 이것들은 범위를 벗어나면 파괴되어 사용할 수 없다. 그러나 동적 할당으로 잡은 메모리는 stack에 저장되지 않기 때문에 영향을 받지 않는다.

→ 동적할당은 heap에 할당 된다. 큰 크기의 배열이나 structure들을 써야 하는데 전역변수처럼 긴 시간 동안 사용해야 한다면 heap에 할당하는 것이 좋다. 사용 후에는 반드시 바로 해제해주어야 한다.

3) 필요한 크기의 메모리를 요청하고 싶을 경우

길이를 미리 알 수 없는 배열을 저장해야 한다고 해보자. 크기를 크게 잡았으나 막상 들어온 것은 1바이트인 경우, 크기를 10으로 잡아놨으나 10 이상의 데이터가 들어오는 경우 등 데이터의 크기와 메모리의 크기가 맞지 않아 메모리 부족 혹은 낭비인 상황이 발생할 수 있다.

→ 일반 배열 선언에서는 동적으로 길이를 변화시키거나 미리 계산하기 어렵다. 동적 할당은 필요할 때 메모리를 요청할 수 있어 유용하다.

지역변수와 매개변수 데이터들은 STACK이라는 메모리 공간에 생성되어 스코프가 끝나는 지점에서 메모리가 파괴된다. 그러나 동적할당의 경우, 유저가 직접 관리하는 HEAP 메모리에 생성되기 때문에, 내가 할당하고 직접 해제하기 전까지는 공간을 차지하게 된다.

2. 동적 할당 사용

두 가지를 사용할 수 있다.

1) C언어의 malloc

2) C++언어의 new

좌항: 주소를 저장하는 포인터 변수 선언

우항: heap에 가서 유저가 요청한 크기만큼 공간을 잡고 그 시작 주소를 알려줌

연산자(=): 우항에서 받은 메모리 위치를 좌항의 변수에 대입

1)

int main()
{
	int* p1 = (int*)malloc(sizeof(int)); //할당
	free(p1); //해제
 
	return 0;
}

2)

int main()
{
	int* p2 = new int; //할당
	delete p2; //해제
	
	return 0;
}

malloc과 new는 메모리 할당을 성공하면 해당 메모리의 주소 값을 리턴한다.

메모리 할당 실패 시, malloc은 NULL, new는 bad_alloc을 리턴한다.

단, malloc은 주소 값을 void* 타입으로 리턴해주므로 형변환을 명시해줘야 한다. (int*) 이렇게. new는 명시해주지 않아도 괜찮다.

Tags:

Categories:

Updated:

Leave a comment