본문 바로가기
프로그래밍/C++

C++ new와 delete/ malloc()과 free()

by Rozentea 2024. 1. 29.
해당 글은 공부를 하면서 적은 글이기 때문에 틀릴 수 있습니다. 참고용으로만 봐주세요~

 

해당 글을 보기 전에 메모리 구조에 대해 먼저 살펴 보면 도움이 될겁니다.

 

C++ 메모리 구조

해당 글은 공부를 하면서 적은 글이기 때문에 틀릴 수 있습니다. 참고용으로만 봐주세요~ 0. 개요 프로그램이 실행되기 위해서 먼저 프로그램이 메모리에 로드되어야 한다. 뿐만 아니라 프로그

rozentea.tistory.com

0. 개요


new & delete, malloc & free는 동적할당을 하기 위해 사용되는 키워드, 함수 입니다.

동적할당이라는 것은 프로그램 실행중에 동적으로 메모리를 할당하는 것을 말합니다.

여기서 중요한 것은 동적으로 메모리를 할당할 때 Heap영역에 할당한다는 점입니다.

 

또한 할당을 받고 사용을 마치면 반드시 할당 받은 메모리를 해제해주어야 한다는 것입니다.

그렇지 않으면 메모리 릭, 메모리 누수가 발생합니다.

 

메모리 누수가 발생하지 않도록 항상 메모리를 해제하는 습관을 들이면 좋습니다.

 

한켠으로는 컴퓨터가 좋아지면서 메모리가 넉넉해 해제해주는 것을 해주지 않아도 괜찮다는 의견도 있지만, 저는 반드시 해제해 주는게 좋다고 생각합니다.

 

1. new와 delete


#include <iostream>

class CTest{
	int num;
}

void main()
{
	CTest* pTest = new CTest();
	int* pArr = new int[10];
    
	delete pTest;
	delete pArr[];
    
	return;
}

new 키워드는 전달받은 대상의 포인터 자료형으로 반환해줍니다.

이때, 대상이 클래스일 경우 자동으로 생성자를 호출해줍니다.

해당 주소를 받아오는 곳은 Heap 영역입니다.

또한 전달 받은 주소는 해당 데이터의 시작점 주소 값입니다.

 

delete 키워드는 전달받은 주소의 메모리를 해제해줍니다.

이때, 대상이 클래스일 경우 자동으로 소멸자를 호출해줍니다.

 

delete를 사용해 메모리를 해제하지 않으면, 프로그램이 끝날 때까지 계속 메모리에 상주하기 때문입니다.

때문에 메모리 누수가 발생하지 않도록 항상 잊지 않고 delete를 사용해 메모리를 해제해 주어야 합니다.

 

2. malloc()과 free()


#include <iostream>
#include <stdlib.h>

void main()
{
    int iArr[4] = {4, 3, 2, 1};
    int* pArr;
    
    pArr = (int*)malloc(sizeof(int) * 4);
    
    free(pArr);
    
    return;
}

malloc의 함수 원형은 void* malloc(size_t size) 입니다.

이때 인자로 전달받는 size는 필요한 메모리양을 바이트 단위로 환산한 값 입니다.

해당 함수를 사용하기 위해서 <stdlib.h> 헤더파일을 포함해 주어야 합니다.

new와 마찬가지로 할당 받는 영역은 Heap 영역이며, 전달 받는 주소는 데이터의 시작점 주소입니다.

또한, 반환 값은 void*입니다. 때문에 형변환을 거쳐주어야 합니다.

 

free()는 주소를 전달받아 메모리를 해제해 줍니다.

 

3. new & delete 와 malloc & free의 차이점


malloc/free는 라이브러리가 제공하는 함수인데 비해 new/delete는 언어가 제공하는 연산자이다.

그래서 별도의 헤더 파일을 포함할 필요없이 언제든지 사용할 수 있으며 이 연산자를 쓴다고 해서 프로그램이 커지는 것도 아니다. 연산자이기 때문에 사용자 정의 타입에 대해 오버로딩할 수 있다.

 

malloc 함수는 필요한 메모리양을 바이트 단위로 지정하고 void*를 리턴하므로 sizeof 연산자와 캐스트 연산자의 도움을 받아야 한다. 이에 비해 new는 할당 타입을 지정하고 해당 타입의 포인터를 리턴하므로 sizeof 연산자와 캐스트 연산자를 쓸 필요가 없다. 할당한 타입과 같은 타입의 포인터 변수로 대입만 받으면 된다.

더보기

malloc()은 우리가 할당받은 Heap 영역을 어떻게 사용할지 모르기 때문에 void*로 반환해준다.

따라서 우리는 malloc()을 사용할 때 항상 형변환을 해주어야 한다.

 

하지만 C++에 새로 추가된 new 키워드는 사용할 때 자료형을 알려줘서 Heap 영역을 어떤 자료형으로 사용할건지 알기 때문에 void*로 반환하는 것이 아니라 해당 자료형의 포인터로 반환하게 된다.

(이때 type-safe로 해당 객체에 맞는 포인터로 변환해 줍니다. type-safe는 컴파일러가 타입형을 확인해주는 것입니다. 길게 풀어 쓰면 int형은 int형으로 string형은 string형으로 잘 저장되고 있는지 확인하는 것입니다.)

 

malloc은 메모리를 할당하는 것만이 목적이므로 초기값을 줄 수 없지만 new 연산자는 동적으로 생성한 변수의 초기값을 지정할 수 있다. 즉, 할당과 동시에 초기화를 할 수 있는데 할당 타입 다음의 괄호에 초기값을 적어 주면 된다.

 

new 연산자로 객체를 할당할 때 생성자가 자동으로 호출된다. 생성자는 생성과 동시에 객체를 초기화할 수 있도록 함으로써 클래스가 기존 타입과 동등한 자격을 가지도록 하는 중요한 역할을 한다. 생성자를 호출한다는 점이 malloc과 new의 가장 큰 차이점이며 C++에서 별도의 할당 연산자가 추가된 이유이다. 마찬가지로 delete로 객체를 삭제할 때는 소멸자라는 특별한 함수가 자동으로 호출된다.

더보기

delete는 템플릿으로 만들어져 포인터의 자료형에 따라 각각 대응하는 다른 코드를 실행하게 된다.

이러한 이유로 delete를 이용하면, 해당 클래스의 소멸자를 호출해 줄 수 있는 것이다.

 

malloc/free 함수로 할당한 메모리는 realloc으로 크기를 바꿔 재할당 할 수 있지만 new에는 이에 대응하는 기능이 없어 새로 할당하여 복사하고 원래 메모리를 해제하는 과정을 직접 해야한다. 그래서 재할당할 때마다 매번 주소가 바뀌며 심지어 축소할 때도 주소가 바뀐다. 또한 실행중에 할당 블록의 크기를 조사하는 _msize에 해당하는 기능도 없다. 할당 대상이 객체가 아니고 재할당을 빈번하게 한다면 malloc/free를 사용할 수도 있고 객체를 할당할 때는 반드시 new/delete를 써야한다. 단, 할당, 해제 함수는 반드시 짝을 맞추어야하며 섞어서 쓸 수는 없다. new로 할당한 메모리는 반드시 delete로 해제해야하고 malloc으로 할당한 메모리는 free로 해제해야 한다.

 

new를 통해 객체생성시 에러가 발생하면 예외처리를 하지만 malloc은 예외처리 없이 null값을 반환하게 됩니다.

 

 

정리하면 다음과 같다.

C에서 동적할당 함수인 malloc, 해제 함수인 free는 메모리의 크기만 알 뿐, 사용 용도는 알 수 없기 때문에 해당 메모리 공간을 특정 객체의 목적으로 사용하더라도 알맞은 생성자나 소멸자를 자동으로 호출해 줄 수 없었다.

C++에서 추가된 new, delete 키워드는 내부적으로는 malloc과 free를 사용하지만, 입력으로 특정 자료형 타입도 같이 전달하기 때문에 동적할당 되어 사용하는 메모리공간의 목적(클래스)를 알 수 있어 알맞은 생성자 및 소멸자를 자동으로 호출해 준다.

4. 참고 문헌


 

 

malloc/free 와 new/delete 차이점

오늘은 malloc/free 와 new/delete 차이점에 대해서 알아보겠다.(www.winapi.com 을 참고했다.) 1. malloc/free는 라이브러리가 제공하는 함수인데 비해 new/delete는 언어가 제공하는 연산자이다. 그래서 별도의

skmagic.tistory.com

 

 

c++ new의 사용법, malloc과의 차이(free, delete)

※컴퓨터의 메모리 구조를 알고 보시면 더 쉽게 이해할 수 있습니다. 메모리 구조 보러가기(클릭) 프로그램을 만들다 보면 상황에 따라 추가적인 메모리 공간을 실시간으로 확보해야 할 경우가

hwan-shell.tistory.com

 

 

[C언어] 동적할당 정리2 (malloc, free 예제)

1. 동적할당 malloc, free 에 대해서2017/07/10 - [/[C언어 & C++ 언어]] - [C 언어] 동적할당 정리1 (malloc, realloc, calloc, free 함수)2017/07/07 - [/[Operating System]] - [운영체제] 프로세스란? (스케줄링, 메모리구조,

blockdmask.tistory.com

 

'프로그래밍 > C++' 카테고리의 다른 글

C++ 메모리 구조  (0) 2024.01.29
C++ 참조형 변수 (Reference variable)  (0) 2024.01.29
함수 오버로딩과 오버라이딩  (2) 2024.01.26
C++ 언어의 특징  (1) 2024.01.26
객체지향 프로그래밍  (4) 2024.01.24