티스토리 뷰

메모리 동적 할당

데이터 영역과 스택 영역에 할당되는 메모리의 크기는 컴파일 타임(compile time)에 미리 결정된다.

힙 영역 크기는 프로그램 실행 후 런 타임(run time)에 사용자가 직접 결정한다. 런 타임 메모리에 할당받는 것을 메모리 동적 할당이라 한다.

 

 

유연한 메모리 관리

동적 할당은 프로그램에 필요한 만큼 메모리를 사용하며, 더 이상 필요하지 않을 경우 메모리를 해제하여 시스템 자원을 효율적으로 관리한다.

 

메모리 공간 절약

동적 할당은 필요한 만큼의 메모리를 할당하므로 공간 효율성이 높다.

 

복잡한 데이터 구조 생성

동적 할당을 통해 복잡한 데이터 구조(예: 동적 배열, 링크드 리스트, 트리)를 생성할 수 있으며, 필요에 따라 크기를 조정할 수 있다.

 

메모리 누수 방지

정확한 메모리 해제를 통해 메모리 누수를 방지할 수 있다.

필요하지 않은 메모리를 해제하지 않으면 프로그램이 계속해서 메모리를 차지하는 문제가 발생한다.

 

런타임 유연성

사용자의 입력, 외부 조건에 따라 메모리 요구량이 조절되기에 메모리 관리 능력의 차이에 다라 유연한 메모리 관리가 가능하다.

 


동적 할당

C/C++

C/C++에서는 malloc(), free(), calloc(), realloc()함수로 동적 할당 및 할당 해제를 진행한다.

명칭 설명
malloc() 사용자가 직접 힙 영역에 메모리를 할당하도록 지원, void*를 반환
free() 힙 영역에 할당받은 메모리 공간을 다시 운영체제로 반환
calloc() 할당하고자 하는 메모리 크기를 받아 할당하고 0으로 초기화하여 전달, void*를 반환
realloc() 이미 할당된 메모리 크기를 바꾸어 재할당
new 자료형을 지정하여 자료형 만큼 메모리를 할당하고 자료형의 포인터를 반환

 

 

malloc() & calloc()

malloc()과 calloc() 함수는 모두 동적 할당을 제공하는 함수이지만 둘은 명확한 차이점이 존재한다.

 

  malloc() calloc()
함수 원형 void *malloc(size_t size); void *calloc(size_t num_elements, size_t element_size);
초기화 할당된 메모리를 초기화하지 않는다.
할당된 메모리 블록은 이전 사용 데이터가 남아있을 수 있다.
할당된 메모리의 모든 비트를 0으로 초기화
할당된 메모리는 항상 0으로 초기화된다.
매개변수
size_t size size_t num_elements, size_t element_size
할당할 바이트 수를 받는다. 할당할 요소 개수와 각 요소 크기를 받는다.
반환 값
할당된 메모리 블록 void 포인터 반환
할당 실패NULL 반환
용도 초기화가 불필요하거나 직접 초기화할 경우 사용 할당 및 초기화가 필요한 경우
배열, 구조체 같은 데이터 구조 생성에 유용
// int 타입의 요소 10개 크기의 배열을 할당
int *ptr = (int *)malloc(10 * sizeof(int)); 

// int 타입의 요소 5개 크기의 배열을 할당하고 0으로 초기화
int *arr = (int *)calloc(5, sizeof(int));

 

 

free()

동적으로 할당된 메모리를 해제하는 함수

void free(void *ptr);

해제할 메모리 블록의 포인터를 매개변수로 넘기면 동적 할당된 메모리 블록을 해제한다.

  • ptr : 메모리 블록 포인터

 

 

realloc()

이미 할당된 메모리 블록의 크기 변경/재할당에 사용된다.

기존 메모리 블록의 데이터를 보존하면서 크기를 조절할 수 있다.

 

ptr = (int *)realloc(ptr, 10 * sizeof(int)); // 메모리 블록 크기를 10으로 확장
  • ptr : 메모리 블록 포인터
  • new_size : 새로운 크기 값

 

 


New/Delete

new/Delete는 함수가 아닌 연산자로 선언과 함께 할당할 자료형을 전달하고 해동 자료형 크기만큼 동적 할당을 한다.

메모리 할당 후 해당 자료형으로 형변환하여 객체를 생성하고 반환해준다. Dispose()메서드나 GC.Collect()를 통해 메모리 해제 관리를 한다. 또한, New로 할당 받은 메모리는 크기를 재조절 할 수 없다.

 

 


결론

함수 반환형 메모리 할당 초기화 반환값 형변환 크기 재할당
malloc void* O X X realloc을 통해 가능
calloc void* O O X realloc을 통해 가능
new 지정된 자료형 O O O 불가능

 

'Computer Language > C & C++' 카테고리의 다른 글

[c] strcpy 함수 구현  (1) 2023.10.24
[C++] C++와 C#의 차이  (1) 2023.09.24
[C] C와 C++의 차이  (0) 2023.09.24
[C] 비트 연산자 (Bitwise Operator)  (0) 2020.11.28
[C++] C++의 메모리 구조  (0) 2020.04.23
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함