런타임에 메모리를 할당 받는 것
데이터 영역과 스택 영역에 할당되는 메모리의 크기는 컴파일 타임에 미리 결정된다. 하지만 힙영역의 크기는 프로그램이 실행되는 도중인 런타임에 사용자가 직접 결정하게 된다. 이를 메모리의 동적할당이라고 한다.
프로그램이 실행 중일 때, 사용자가 직접 힙 영역에 메모리를 할당해주는 함수
// [malloc 함수의 원형]
#include <stdlib.h>
void *malloc(size_t size);
힙 영역에 할당받은 메모리 공간을 다시 운영체제로 반환해주는 함수
메모리의 동적할당으로 힙 영역에 생성된 메모리의 크기는 런타임 내내 변화된다. 다 사용한 메모리를 해제해주지 않으면 메모리가 부족해질 수 있다.
free()
함수를 통해 사용이 끝난 메모리는 해제해주어 메모리 누수를 방지하도록 하자.
// [free 함수의 원형]
#include <stdlib.h>
void free(void *ptr);
C언어의 malloc과 free를 이용한 동적 할당에서는 아래와 같은 불편함이 존재한다.
이 불편함을 해소하기위해 C++에서는 new와 delete를 사용한다.
malloc()
--->new()
free()
--->delete()
int *ptr1 = new int;
double *ptr2 = new double;
int *arr1 = new int[3];
double *arr2 = new double[7];
const 키워드를 사용하지 않고서는 참조자의 선언은 변수에만 가능하다. C++의 new
연산자를 이용해서 할당된 메모리 공간은 변수로 간주되어 참조자의 선언이 가능하다.
delete ptr1;
delete ptr2;
delete []arr1;
delete []arr2;
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++ 에서는
new
와delete
를 이용하자!
<출처 : 윤성우의 열혈 C++ 프로그래밍>
위 책을 공부하며 정리한 내용입니다.