Notice
Recent Posts
Recent Comments
«   2024/12   »
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
Archives
Today
Total
관리 메뉴

SYDev

C++ Chapter 02-5 : malloc & free를 대신하는 new & delete 본문

Programming Lang/C++

C++ Chapter 02-5 : malloc & free를 대신하는 new & delete

시데브 2023. 7. 11. 16:55

동적 메모리 할당 & 정적 메모리 할당

동적 메모리 할당

: 동적 메모리 할당은 컴퓨터 프로그래밍에서 실행 시간 동안 사용할 메모리 공간을 할당하는 것이다.

 

정적 메모리 할당

: 정적 메모리 할당은 메모리 할당 방법 중 하나로, 프로그램이 실행될 때 이미 메모리의 크기가 결정된다.

 

 정적 메모리 할당의 예시는 다음과 같다.

char examples[10];

 위처럼 코드를 입력하면 char 자료형 10개가 나란히 선언되고, examples 배열에는 10개의 자료형만 들어갈 수 있다. 

 

동적 메모리 할당을 하는 이유?

 정적 메모리 할당을 하면 기억공간이 낭비될 경우가 생긴다. 예를 들어서 위에서 선언한 examples에는 10글자를 넣을 수 있는데 이에 미치지 못하는 글자수를 가진 문자형을 넣는다면 그만큼 메모리가 낭비된다. 이런 낭비를 최소화 하기 위해서 프로그램 실행 중에 입력되는 데이터에 맞게 기억공간을 할당할 필요가 있다.

 

동적 메모리 할당의 과정

1. 포인터 변수를 선언

2. 임의의 저장 공간을 원하는 만큼 할당받고 그 주소를 포인터에 저장

3. 포인터를 이용해 할당받은 메모리 공간을 사용

4. 사용이 끝나면 할당받은 메모리를 해제하여 운영체제에 반납

 

Malloc & Free(C언어)

 c++에서 메모리를 동적으로 할당하는 함수에 대해서 알아보기 전에 c언어의 malloc & free 함수를 알아보자.

 

 malloc & free 함수를 이용하기 위해서는 헤더파일(stdlib.h)이 include 되어있어야 한다.

#include <stdlib.h>

 동적 메모리 할당의 1번 과정인 포인터를 하나 선언한다.

char *str = NULL;

 char형 포인터 str을 선언하였고, NULL로 초기화하였다. 

 

 다음으로 저장공간을 할당받고 포인터에 주소를 저장한다.

str = (char*)malloc(20)

 여기서 malloc 함수가 처음으로 등장하는데 이를 이용하여 괄호 안의 byte만큼 저장 공간을 만들어서 그 주소를 포인터에 저장할 수 있다. 해당 코드를 자세히 알아보면 다음과 같다.

포인터를 받을 변수 = (자료형) malloc(할당받을 바이트 수)

 위 코드에서 '자료형'은 '포인터를 받을 변수'의 자료형과 일치해야 한다.

 

 다음으로 위의 3번 과정처럼 동적 메모리 할당을 한 'str'을 이용해 저장공간을 사용한다.

strcpy(str, "안녕하세요.");
printf("%s|n", str);
더보기

 strcpy 함수 : 헤더파일 <string.h>에 포함된 함수로, strcpy(dest, origin) -> origin에 있는 문자열 전체를 dest로 복사하는 함수

 마지막으로 과정으로 할당된 메모리를 해제한다.

free(str)

free() 함수의 괄호 안에 메모리가 할당된 포인터를 입력하면 할당된 메모리 공간을 다시 운영체제에 반납한다. 이 부분을 생략한다면 할당된 동적 메모리가 많아져 메모리 오류가 발생하거나 운영체제, 프로그램이 느려질 수 있기 때문에 필수적으로 진행해야 하는 과정이다.

 

New & Delete

 c++에서 malloc & free 함수를 대체하는 것이 new & delete 함수이다.

 

 우선 new 함수의 사용방법을 정리하자면 다음과 같다.

int * ptr1 = new int; // int형 변수의 할당
double * ptr2 = new double; // double형 변수의 할당
int * arr1 = new int[3]; // 길이가 3인 int형 배열의 할당
double * arr2 = new double[7]; // 길이가 7인 double형 배열의 할당

 delete 함수의 사용 방법은 다음과 같다.

delete ptr1; // 앞서 할당한 int형 변수의 소멸
delete ptr2; // 앞서 할당한 double형 변수의 소멸
delete []arr1; // 앞서 할당한 int형 배열의 소멸
delete []arr2; // 앞서 할당한 double형 배열의 소멸

 이와 관련하여 다음 예제를 살펴보자.

#include <iostream>
#include <string.h>
using namespace std;

char * MakeStrAdr(int len)
{
    char * str= new char[len];
    return str;
}

int main(void)
{
    char * str = MakeStrAdr(20);
    strcpy(str, "I am so happy~");
    cout<<str<<endl;
    delete []str;

    return 0;
}
I am so happy~

 malloc & free 함수와 비교했을 때 new&delete 함수가 훨씬 간결한 코드를 보이는 것을 알 수 있다. 또한, c++에서는 malloc & free 함수의 호출이 문제가 될 수 있으니 해당 함수의 호출은 삼가해야 한다.

 

동적 할당된 메모리 공간의 참조자 선언

 참조자 선언은 (const 참조자가 아닌 이상) 상수가 아닌 변수를 대상으로만 가능하다. 그렇다면 new 연산자를 이용하여 할당된 메모리 공간에도 참조자 선언이 가능할까? c++에서는 할당된 메모리 공간도 변수로 간주하기 때문에 참조자의 선언이 가능하다.

#include <iostream>
using namespace std;

int main(void)
{
    int *ptr = new int;
    int &ref = *ptr;
    ref = 20;
    cout<<*ptr<<endl;

    return 0;
}
20

 흔히 사용되는 문장은 아니지만 포인터 연산 없이 힙(Heap) 영역에 접근했다는 사실을 주목할 필요가 있다.

 

 


참고자료

 

초보자를 위한 기초 C 언어 강좌 #15 : 메모리 할당

본 강좌는 아래 동영상 강좌와 같이 진행됩니다. 되도록이면 동영상과 같이 보시는 것을 추천합니다. 유튜브 채널 가기 강좌 15편 동영상 보기 이번시간에는 임의의 메모리 공간을 가져다 쓰는 '

studyc.tistory.com

 

[C언어/C++] strcpy, strncpy 함수(문자열 복사)에 대해서

안녕하세요. BlockDMask 입니다. 오늘은 C 스타일의 문자열인 char*, char[] 타입의 문자열을 복사하는 함수 두가지에 대해서 알아 볼 것 입니다. 두 함수는 바로 strcpy, strncpy 입니다. 이 두함수가 무슨

blockdmask.tistory.com

  • 윤성우, <윤성우의 열혈 C++ 프로그래밍>, 오렌지미디어, 2010.05.12