C++ 함수 동적할당 - c++ hamsu dongjeoghaldang

메모리의 동적 할당이란?

"메모리를 동적 할당한다"라는 뜻은 컴퓨터 프로그램이 실행되는 도중인 런타임 도중에 사용할 메모리 공간을 할당하는 것을 말합니다. 동적 할당되는 메모리는 힙 영역에 생성되게 되며 컴파일 타임에 메모리의 크기가 결정되는 데이터 영역이나 스택 영역의 정적 메모리 할당과는 대조적인 개념입니다.

malloc 함수 사용법

#include <stdlib.h> //malloc 함수가 포함된 헤더 파일

void* malloc(size_t size)

malloc 함수를 사용하기 위해서는 malloc 함수가 포함되어 있는 <stdlib.h> 헤더나 <malloc.h> 헤더를 포함시켜야 합니다.

인자 값
size_t : 동적으로 할당할 메모리의 크기

반환 값
성공시 할당한 메모리의 첫번째 주소 리턴, 실패시 NULL리턴

malloc 함수 사용 예제

#include <stdio.h>
#include <stdlib.h>

void main()
{
    int* arr;
    arr = (int*)malloc(sizeof(int) * 4); // size 4 동적할당

    arr[0] = 100;
    arr[1] = 200;
    arr[2] = 300;
    arr[3] = 400;

    for (int i = 0; i < 4; i++) {
        printf("arr[%d] : %d\n", i, arr[i]);
    }

    free(arr); //동적할당 해제
}
C++ 함수 동적할당 - c++ hamsu dongjeoghaldang

배열을 동적으로 할당해야할 경우에는 malloc함수를 사용하여야 합니다. 다른 프로그래밍 언어와는 달리 C언어는 동적으로 size를 결정해야 할 때는 malloc함수를 사용해야만 구현이 가능하니 해당 함수와 익숙해지도록 합시다.

C++ 함수 동적할당 - c++ hamsu dongjeoghaldang

malloc 함수를 사용하는 방법이 생소하다고 생각하는 분들도 있을 것입니다. malloc함수의 특성 때문인데 malloc은 리턴 값으로 void형 포인터를 리턴합니다. malloc은 메모리만 할당하는 함수이기 때문에 어떠한 데이터 형을 사용하는지 알 수 없습니다. 그렇기에 void포인터를 반환하고 개발자가 알맞게 변환하여 사용할 수 있도록 함수가 설계되어있습니다. 그러므로 위의 예제에서는 리턴된 void*를 int*로 캐스팅한 것입니다. C언어가 오버로딩이 안되기에 어쩔수 없는 부분인 듯 합니다.

인자 값으로 sizeof(int)를 하는 이유는 int의 크기만큼을 할당받아야 하니 int의 크기와 할당받을 크기를 서로 곱해주어 최종 메모리의 크기를 넣어주는 것입니다.

메모리의 해제 (free)

#include <stdlib.h> // free함수가 포함된 헤더파일

void free(void *ptr);

malloc함수를 사용한 뒤 꼭 메모리를 해제시켜줍시다.

인자 값 
ptr : 해제하고자 하는 메모리의 포인터

동적 메모리를 할당하면 힙 메모리에 공간이 생성됩니다. 이 공간은 프로그램이 종료될 때까지 존재합니다. 따라서 메모리를 할당만 하고 해제를 해주지 않으면 사용하지는 않는데 메모리 사용량만 계속해서 증가하게 되겠죠. 이러한 현상을 메모리 누수라고 합니다. 즉 동적 할당으로 힙 메모리에 공간을 생성해놓은 뒤 회수하지 않으면 프로그램이 실행되는 동안은 그 공간은 계속해서 살아있게 되고 이는 메모리의 낭비를 초래하여 성능 부하를 일으킬 수 있습니다. 고로 사용하지 않는 메모리는 free함수를 사용하여 꼭 회수해주도록 합시다.

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> // malloc, free 함수가 선언된 헤더 파일 int main(void) { int Value; scanf("%d", &Value); int *numPtr = malloc(sizeof(int) * Value); // (int 크기 * 입력받은 크기)만큼 동적 메모리를 할당 for (int i = 0; i < Value; i++) { numPtr[i] = i; } for (int i = 0; i < Value; i++) { printf("%d\n", numPtr[i]); } free(numPtr); // 동적할당 메모리 해제 return 0; }

1. 동적할당 malloc, free 에 대해서

  • 동적할당이라는 것은 프로그램 실행중에 동적으로 메모리를 할당하는 것을 말합니다.
  • 여기서! 중요한것은 동적으로 메모리를 할당할때 Heap(힙)영역에 할당을 한다는 것 입니다.
  • 메모리 영역에 대해서 궁금하시다면 위에 [운영체제] 프로세스랑? 부분에 정리를 해놓았습니다.
  • 함수 원형은 void* malloc(size_t size) 입니다.
  • 해당 함수를 사용하기 위해서는 <stdlib.h> 헤더파일을 include 해야합니다.
  • 함수 동작은 매개변수에 해당하는 size_t 만큼의 크기만큼 메모리를 할당하고
    • 성공하면 : 할당한 메모리의 첫번째 주소 리턴
    • 실패하면 : NULL 리턴
  • 제일 중요한점
    • 할당한 메모리는 꼭!꼭!꼭!꼭! 해제 해주어야합니다.
    • 그렇지 않으면 메모리 릭, 메모리 누수가 발생합니다. (어마어마하게 자주 발생하니 꼭 잊지 말아주세요)
  • 글로 아무리 설명해 보았자 눈에 들어오지 않으니 바로 예제로 넘어가도록 하겠습니다.

2. 동적할당 malloc, free 예제1 (사이즈가 정해진 배열 복사)

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

32

33

#include<stdio.h>

#include<stdlib.h>

int main(void)

{

int arr[4= { 4,3,2,1 };        //크기가 4인 배열 선언

int* pArr;                        //int 타입을 가리키는 포인터 pArr 선언

//int 타입사이즈 * 4 만큼의 메모리를 할당해라!

pArr = (int *)malloc(sizeof(int* 4);

if (pArr == NULL)

{

//메모리 할당에 실패하면 이쪽으로 들어옵니다.

printf("malloc error");

}

for (int i = 0; i < 4++i)

{

pArr[i] = arr[i];

}

for (int i = 0; i < 4++i)

{

printf("%d \n", pArr[i]);

}

//할당한 메모리를 해제해줍니다.

free(pArr);

system("pause");

return 0;

}

cs

  • int* pArr = (int *)malloc(sizeof(int) * 4);
  • (int *) = malloc의 반환형이 void* 이므로 (int *)형태로 형변환을 해달라고 한 것 입니다.

    sizeof(int) = sizeof( )는 괄호 안에 자료형 타입을 바이트로 연산해주는 연산자 입니다.

    sizeof(int) * 4 = 곱하기 4를 해준 이유는 위에 선언한 arr[4]사이즈가 가지고 있는 동일한 크기의 메모리를 할당하기 위해서 int 타입 * 4를 해준 것 입니다.

    3. 동적할당 malloc, free 예제2 (과목의 점수 받고, 평균점수 내기)

    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

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    #define _CRT_SECURE_NO_WARNINGS

    #include<stdio.h>

    #include<stdlib.h>

    int main(void)

    {

    int num;

    int *pArr;

    int average = 0;

    printf("몇개의 과목을 저장할 것인가 자네 : ");

    scanf("%d"&num);

    //0개 넣으면 프로그램 종료해.

    if (num == 0)

    {

    return 0;

    }

    //과목 개수 만큼 메모리 동적할당을 합니다.

    pArr = (int*)malloc(sizeof(int* num);

    //동적할당 실패

    if (pArr == NULL)

    {

    printf("malloc error");

    exit(1);

    }

    //점수를 받고 저장합니다.

    for (int i = 0; i < num; ++i)

    {

    printf("[%d/%d]점수 입력 : ", i + 1, num);

    scanf("%d"&pArr[i]);

    }

    //출력

    for (int i = 0; i < num; ++i)

    {

    printf("%d번째 과목의 점수 : %d\n", i + 1, pArr[i]);

    }

    //평균 출력

    for (int i = 0; i < num; ++i)

    {

    average += pArr[i];

    }

    //정수로 나누어 지기 때문에 소수점 이하는 버려집니다.

    average /= num;

    printf("평균 : %d\n", average);

    //동적할당 해제

    free(pArr);

    system("pause");

    return 0;

    }

    cs

    C++ 함수 동적할당 - c++ hamsu dongjeoghaldang

    '<개인공부> > [C언어, C++]' 카테고리의 다른 글

    [C언어/C++] 절대값 함수 abs, fabs에 대해서.  (3)2019.03.18
    [C언어/C++] atoi, atof, atol 함수 (char* to int)  (12)2019.03.14
    [C언어/C++] rand, srand, time 랜덤함수에 대해서 (난수생성)  (36)2019.01.11
    [C언어/C++] pow, sqrt 함수에 대해서(루트함수, 제곱, 제곱근)  (4)2019.01.04
    [C언어/C++] assert 함수에 대해서 : 디버깅을위한, 더 안전한 코드를 위한 오류 검출 방법  (1)2018.10.24
    [C언어/C++] define 매크로와 inline 함수에 대해서  (3)2017.11.03
    [C언어/C++] clock 함수를 통한 알고리즘 시간 측정  (0)2017.10.19
    [C언어/C++] 올림, 내림, 반올림 (floor, ceil) 함수  (7)2017.08.11