C/C++ 메모리 동적할당




안녕하세요 열코입니다.

이번시간에는 C/C++에서의 메모리 동적할당에 대해 알아보도록 하겠습니다.



☞ 메모리 동적 할당이란?

C/C++에서 실행 시간동안 사용할 메모리 공간을 할당하는 것을 말합니다.

메모리 공간 필요 시 할당하고, 사용이 끝난 후 반납을 사용자가 원하는 시점에 원하는 크기만큼 가능합니다.

사용자에 의해 메모리가 동적으로 할당이 되면 프로그램이 끝날 때 까지 유지되므로,

메모리 공간 사용이 끝나면 메모리 낭비(누수)를 줄이기 위해 명시적으로 메모리 할당을 해제 해주어야합니다.


* 참고로 자바에는 가비지 컬렉션이 존재하여 사용되지않는 메모리를 자동으로 해제해줍니다.

C/C++에는 가비지 컬렉션이 존재하지 않으므로 사용자가 명시적으로 메모리를 해제 해 주어야 합니다. 



 컴퓨터 메모리 구조?

컴퓨터 메모리 구조에 대해 잠깐 짚고 넘어가겠습니다. 컴퓨터 메모리의 공간은 

크게 4부분 - 스택, 힙, 데이터, 코드(텍스트) 부분으로 나눌 수 있습니다.


여기서 스택, 힙 공간은 프로그램 실행(런타임) 크기가 결정됩니다.

데이터와 코드 부분은 컴파일러에 의해 컴파일시 크기가 결정됩니다.


- 스택(Stack) 공간은 지역변수와 매개변수 등이 할당되는 임시적인 영역입니다.

- 힙(Heap) 공간은 동적으로 메모리를 할당하는 곳이며 생성 중 크기를 결정합니다.

- 데이터(Data) 공간은 전역 변수와, 정적(static) 변수, 초기화 된 배열 등이 존재합니다.

- 코드(Code) 공간은 프로그램의 명령어나 기계어 명령이 존재합니다. 



 동적 메모리 할당/해제 방법?

C 프로그래밍에서는 malloc()과 calloc() 함수 등을 사용하여 런타임에 메모리를 동적으로 생성하며,

free() 함수를 사용하여 동적으로 할당된 메모리를 명시적으로 해제합니다.

C++ 프로그래밍에서는 이러한 함수들을 더 편하게 사용할 수 있도록 new와 delete 연산자를 사용하여 할당 및 해제합니다.


동적할당 코드에는 포인터 개념 및 사용이 포함되어 있습니다. 

아직 포인터에 대한 개념이 잡혀있지 않다면 여기를 눌러 개념을 잡고 넘어 갑시다.


- C 예제코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <stdlib.h>
 
int main(void) {
    int *p;
    int size = 5;
    p = (int *)malloc(sizeof(int* 5);
 
    for (int i = 0; i < 5; i++) {
        p[i] = i + 1;
    }
 
    for (int i = 0; i < 5; i++) {
        printf("%d\n", p[i]);
    }
 
    free(p);
 
    return 0;
}
cs


먼저 malloc() 함수를 사용하기 위해 stdlib.h 헤더파일을 include 해줍니다.

그리고 malloc() 함수를 사용하기 위해 포인터 변수를 하나 생성합니다. 여기서 포인터의 자료형을 동적할당 하려는 자료형과

일치해야 합니다. 저는 int형 변수 5개를 동적할당 받기위해 int형 포인터 변수를 선언했습니다.


그리고 malloc() 함수의 반환값은 void*이므로 (int*)를 malloc() 함수 앞에 명시적으로 형변환을 시켜줍니다.

만약 char*라면 (char*)를 사용하여 명시적으로 형변환을 해줍니다. (자료형에 맞추시면 됩니다.)


그리고 malloc() 함수의 매개변수로 동적할당 받을 메모리 크기를 넘겨줍니다.

int형 변수 5개이므로 4*5 = 20을 넘겨주면 되겠다 싶더니 무슨 이상한 문자들이 있군요...

sizeof() 함수는 해당 자료형의 크기를 반환합니다. sizeof(int)니까 int형 자료형의 크기가 되겠군요.

5개가 필요하니 5로 초기화 해준 size를 곱해줍니다.

여기서 sizeof()의 사용을 한 이유는 프로그램 사용자마다 운영체제가 다르기 때문에 자료형의 크기가 달라질 수 있기 때문입니다.

sizeof()함수를 사용하면 64bit 컴퓨터에서는 8바이트로 반환되기 때문이죠.


그리고 동적할당 받은 메모리는 배열처럼 사용 가능합니다. (보통 배열의 동적 크기를 지정해주기 위해 사용됩니다.)


사용후에는 free() 함수를 이용하여 메모리 할당을 해제 해 주었습니다. 


ㅇ 출력 결과


1

2

3

4

5



- C++ 예제코드

C++ 프로그래밍에서는 new와 delete 키워드를 사용합니다.

사용법은 C 프로그래밍 보다 훨씬 쉬우니 설명은 생략하고 아래의 예제 코드를 확인 해 봅시다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
 
int main(void) {
    int *= new int[5];
 
    for (int i = 0; i < 5; i++) {
        p[i] = i + 1;
    }
 
    for (int i = 0; i < 5; i++) {
        cout << p[i] << "\n";
    }
 
    delete[] p;
 
    return 0;
}
cs


어때요? 진짜 말한대로 코드가 간단하죠?

new 키워드를 통해 int형 변수 5개 ([5])를 동적할당합니다.

그리고 delete키워드를 통해 동적할당 해제.


ㅇ 출력 결과


1

2

3

4

5


개인적으로 C++ 프로그래밍의 메모리 동적 할당 방법이 더 쉽고 간결해서 자주 사용하는 편입니다. ^^



이상 'C/C++ 메모리 동적할당'에 대해 알아보았습니다.

질문 또는 오타나 잘못된 정보가 있는 경우 댓글로 달아주세요!

공감♡ 버튼을 눌러주시면 더욱 유용하고 좋은 포스팅으로 찾아 뵙겠습니다.



'C, C++' 카테고리의 다른 글

C 표준 출력 함수 printf()  (0) 2018.10.22
C++ 가상 함수(Virtual Function)  (8) 2018.10.19
C++ 연산자 오버로딩  (2) 2018.10.12
C++ 함수 오버로딩  (0) 2018.10.11
C++ friend 클래스와 함수  (1) 2018.10.10
C++ 클래스 접근제한자  (0) 2018.10.10
C++ 클래스와 객체  (0) 2018.10.09
C/C++ 구조체 사용법 및 예제  (1) 2018.10.08

to Top