[C++3] new & delete

모옹·2023년 12월 6일
0

C++

목록 보기
3/10

3. 메모리의 동적할당

런타임에 메모리를 할당 받는 것

데이터 영역과 스택 영역에 할당되는 메모리의 크기는 컴파일 타임에 미리 결정된다. 하지만 힙영역의 크기는 프로그램이 실행되는 도중인 런타임에 사용자가 직접 결정하게 된다. 이를 메모리의 동적할당이라고 한다.

3-1. C언어의 malloc 과 free


3-1-1. malloc()

프로그램이 실행 중일 때, 사용자가 직접 힙 영역에 메모리를 할당해주는 함수

// [malloc 함수의 원형]
#include <stdlib.h>
void *malloc(size_t size); 
  • 할당받고자 하는 메모리의 크기를 바이트 단위의 인수로 전달받는다.
  • 이후, 전달받은 메모리의 크기에 맞는, 아직 할당되지 않은 메모리 블록을 찾아, 첫번째 바이트의 주소값을 반환한다.
  • 주소값을 반환하므로, 힙 영역에 할당된 메모리 공간으로 접근하려면 포인터를 사용해야한다.
  • 만약 적당한 블록이 없다면 널 포인터를 반환한다.

3-1-2. free()

힙 영역에 할당받은 메모리 공간을 다시 운영체제로 반환해주는 함수

메모리의 동적할당으로 힙 영역에 생성된 메모리의 크기는 런타임 내내 변화된다. 다 사용한 메모리를 해제해주지 않으면 메모리가 부족해질 수 있다.
free()함수를 통해 사용이 끝난 메모리는 해제해주어 메모리 누수를 방지하도록 하자.

// [free 함수의 원형]
#include <stdlib.h>
void free(void *ptr);
  • 인수로 해제하고자 하는 메모리 공간을 가리키는 포인터를 전달받는다.
  • 인수타입이 void형 포인터 : 어떠한 타입의 포인터여도 인수로 전달될 수 있다.

3-2. C++의 new와 delete

C언어의 malloc과 free를 이용한 동적 할당에서는 아래와 같은 불편함이 존재한다.

  • 할당 대상의 정보를 무조건 바이트 단위로 전달해야함
  • 반환형이 void포인터이므로 적절한 형 변환이 필요함

이 불편함을 해소하기위해 C++에서는 new와 delete를 사용한다.

malloc() ---> new()
free() ---> delete()

3-2-1. new()

int *ptr1 = new int;
double *ptr2 = new double;
int *arr1 = new int[3];
double *arr2 = new double[7];

const 키워드를 사용하지 않고서는 참조자의 선언은 변수에만 가능하다. C++의 new 연산자를 이용해서 할당된 메모리 공간은 변수로 간주되어 참조자의 선언이 가능하다.

3-2-2. delete()

delete ptr1;
delete ptr2;
delete []arr1;
delete []arr2;

new 연산 시 반환된 주소 값을 대상으로 delete 연산을 진행하되, 할당된 영역이 배열의 구조라면 []를 추가로 명시해주면 된다.


3-2-3. malloc/free -> new/delete

아래 예제를 통해 비교해보면, new와 delete를 사용한 동적할당 및 해제가 훨씬 간단한 것을 알 수 있다.

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

char * making(int len){

    // 1. malloc 을 이용한 동적할당
    char *str = (char*)malloc(sizeof(char)*len);
    // 2. new 를 이용한 동적할당
    char *str = new char[len];

    return str;
}

int main(){
    char *str = making(20);
    strcpy(str, "Hello world!");
    cout << str << endl;

    // 1. free 를 이용한 동적할당 해제
    free(str);
    // 2. delete 를 이용한 동적할당 해제
    delete []str;

    return 0;
}

결론!

C++ 에서는 newdelete를 이용하자!


[추가 참조] C언어의 malloc과 free 함수

<출처 : 윤성우의 열혈 C++ 프로그래밍>
위 책을 공부하며 정리한 내용입니다.

0개의 댓글