본문 바로가기

C++/C++ 문법

[C++] 배열, 동적 할당 (new와 delete)

728x90
반응형

메모리 할당

 

new와 delete를 사용하면 malloc와 free를 대체하여 메모리를 할당할 수 있다.

 

 

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

char *MakeStr(int len) {
	char* str = (char*)malloc(sizeof(char)*len);
	return str;
}


int main()
{
	char* str = MakeStr(20);
	strcpy(str, "Hello World!");
	std::cout << str;
	free(str);
	return 0;
}

 

위와 같이 C++에서도 malloc와 free를 사용한 메모리 할당이 가능하다.

그러나 위 방법을 사용할 경우 두 가지 불편한 점이 존재한다.

할당할 대상의 정보를 반드시 바이트 크기로 전달해야 하며 반환형이 void포인터이기 때문에 적절히 형 변환을 해주어야한다.

 

 

이때 new와 delete를 사용하면 이러한 불편한 점을 해결할 수 있다.

 

 

 

 

 

 

new

 

new를 사용하여 메모리를 할당하는 방법은 아래와 같다.

 

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

 

위 코드에서 ptr1과 ptr2에는 각각 int형과 double형의 자료가 들어갈 수 있는 메모리가 할당되며

arr1에는 길이가 3인 int형 배열, arr2에는 길이가 5인 double형 배열이 할당된 것이다.

 

 

 

 

 

 

 

 

 

 

동적 배열 초기화

 

동적 배열을 선언과 동시에 0으로 초기화하는 방법은 다음과 같다.

int *arr = new int[5]();

 

C++11 이전에는 동적배열을 일괄적으로 0이 아닌 값으로 초기화하는 방법이 없었기 때문에

개별적으로 초기화를 진행해주어야만 했다.

 

그러나 C++11부터는 다음과 같은 방법을 사용하여 초기화하는 것이 가능하다.

int *arr = new int[5] {0, 1, 2, 3, 4};

 

정적 배열도 같은 방법으로 초기화하는 것이 가능하다.

int arr[5] {0, 1, 2, 3, 4};

 

또한 정적 배열은 위 방법을 사용하여 초기화를 진행할 경우 선언 시에 배열의 개수를 명시하지 않아도 된다.

int arr[] {0, 1, 2, 3, 4};

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

delete

 

메모리를 해제할 때에는 delete를 사용할 수 있다.


이때 자료형을 명시해 줄 필요는 없지만 아래 코드처럼 배열인지 변수인지는 구분하여 사용하여야 한다.

 

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

 

 

 

 

 

 

 

힙에 할당된 변수에 접근

 

new 지시자와 &연산자를 사용하여 포인터를 사용하지 않고도 힙 영역에 할당된 변수에 접근하는 것이 가능하다.

 

int *ptr = new int;
int &ref = *ptr;
ref = 20;
std::cout<<*ptr;

 

 

20이 정상적으로 출력되는 것을 확인할 수 있다.

 

 

 

 

 

 

 

new와 delete를 사용하는 이유

 

new와 delete 또한 &연산자를 공부할 때와 마찬가지로 근본적인 문제에 부딪혔다.
도대체 이것이 왜 필요한가? 그냥 포인터를 사용하고 malloc를 사용하면 되는 것 아닌가?

 


이에 대한 답은 아래와 같다.

malloc와 free를 사용하는 것과 new와 delete를 사용하는 것은 동작방식에서 차이가 있다.


malloc와 free를 사용할 경우 프로그램에 문제가 발생할 가능성이 있어 new와 delete를 사용하는 것이 좋다.

 

 


* malloc을 사용할 경우 생성자가 호출되지 않는 등의 문제가 있다.

 

 

728x90
반응형