IT 프로그래밍/자료구조

동적 메모리 할당과 동적 객체 생성

기술1 2024. 9. 2. 16:44
반응형

동적 메모리 할당

변수를 선언하는 대신 프로그램의 요청으로 메모리를 할당받는 방식입니다. C에서는 malloc 함수를 호출하여 동적메모리할당을 요청하면 요구하는 크기의 메모리를 할당하고 그 시작 주소를 반환합니다.

 

C++에서는 new 연산자를 사용합니다. new 연산자는 생성된 객체의 주소를 반환합니다. 

 

malloc 함수

int n;
scanf("%d", &n);
int* p = (int*)malloc(n * sizeof(int));
if (p = NULL) {
	/*동적 메모리 할당이 실패*/
	/*적절한 조치를 취한다.*/
}

p[0] = 12;
p[1] = 24;
*(p + 2) = 36;

 

배열 재할당

동적으로 생성된 배열은 공간이 부족할 경우 더 큰 배열을 생성하여 사용할 수 있습니다. 

int *array = (int *)malloc(4*sizeof(int));
/* 배열 크기가 부족한 상황을 가정하자. */
int *tmp = (int *)malloc(8*sizeof(int));
for(int i=0; i<4; i++)
	tmp[i] = array[i];
free(array);
array = tmp;

크기가 8인 배열을 추가적으로 할당받습니다. 별개로 32비트인 메모리를 할당받아서 tmp라는 새로운 변수에다가 저장을 합니다. 그런 다음 이 array 안에 있는 데이터를 tmp의 할당받은 데이터로 복사를 합니다. 

 

#include <iostream>
using namespace std;

int main()
{
	int n;
	cin >> n;
	int* p = new int[n];

	p[0] = 12;
	p[1] = 24;
	*(p + 2) = 36;

	delete[] p;

	return 0;
}

malloc과 달리 byte 단위가 아닌 배열의 크기를 지정합니다. (n)

 

new 연산자는 동적 생성된 배열의 첫 칸의 주소를 반환합니다. 보통의 배열처럼 사용하면 됩니다.

 

C와 C++에서의 메모리 관리

전역변수

함수의 외부에 선언된 변수들이며 프로그램이 시작될 때 메모리가 할당되며 프로그램이 종료될 때까지 유지됩니다. 데이터 섹션이라고 부르는 메모리 영역에 위치해있습니다.

 

지역변수

함수의 내부에 선언된 변수들이며 자신이 속한 함수가 호출될 때 메모리가 할당되며 함수가 return될 때 소멸됩니다. 스택이라고 부르는 영역에 위치해있습니다. 

 

동적 메모리 할당 / 동적 생성 객체

malloc 혹은 new 연산자로 필요한 크기의 메모리를 할당/동적 객체 생성합니다. 동적으로 할당된 메모리는 힙(heap)이라고 부르는 영역에 할당됩니다. 동적으로 할당된 메모리는 free함수(C) 혹은 delete(C++)로 삭제하지 않은 한 계속해서 존재합니다. 

 

 

 

반응형