OneDev

[C++] new 와 delete : 메모리 할당과 해제 본문

Language/C++

[C++] new 와 delete : 메모리 할당과 해제

one_dev 2022. 8. 9. 17:22

▣ 서론

메모리 관리는 언제나 중요한 문제이다.

프로그램이 정확히 실행되기 위해서는 컴파일 시 모든 변수의 주소값이 확정되어야만 했는데, 

이를 위해서 프로그램에 많은 제약이 따랐다.

 

이에 프로그램 실행시 자유롭게 할당하고 해제할 수 있는 힙(Heap) 이라는 공간이 따로 생겼다.

컴파일러에 의해 안정성이 보장되는 스택(Stack) 과 달리 힙은 사용자가 스스로 제어해야 하기 때문에 

책임이 다른다.

 

C 언어에서는 힙 상에서의 메모리 할당과 해제를 위해 malloc 함수와 free 함수를 지원하였다면,

C++ 언에 차원에서 지원하는 것이 new 와 delete 이다.

(물론 C++에서도 malloc 과  free 를 사용할 수 있다)

new 는 malloc에 대응되는 것으로 메모리를 할당하고, 

delete 는 free에 대응되며 할당된 메모리를 해제할 때 사용된다.

 

 

▣ new 와 delete 의 기본적인 사용법

new 와 delete의 기본적인 형식은 다음과 같다

소괄호는 없다 생각하고 보면 된다

 

(예)

#include <iostream>

int main() {
  int* p = new int;			// int 크기의 공간을 할당하여 그 주소값을 p 에 대입
  *p = 10;					// p위치의 할당된 공간에 10이란 값을 집어넣었다

  std::cout << *p << std::endl;

  delete p;				// 메모리를 할당했다면 반드시 해제할 것!
  return 0;
}

 

delete p 를 하게 되면 p 에 할당된 공간이 해제된다.

이 때 delete 로 해제할 수 있는 공간은 어디까지나 new 를 통해 할당된 공간뿐이다.

일반 지역변수 등을 delete 로 해제하려 하면 Heap 이 아닌 공간을 해제하려 한다는 경고메세지를 볼 수 있을것이다.

 

▣ new 로 배열 할당하기

배열을 입력받을 때, 배열의 크기가 고정되어 있다면 편하겠지만 그렇지 않은 경우가 많다.

예를 들면 알고리즘 문제를 풀 때 각각의 테스트 케이스에 대해 배열의 크기가 달라지는 경우가 있을 수 있다.

이러한 경우 배열의 길이가 유동적으로 바뀌는 경우, 아무 생각 없이 배열의 크기에 변수를 대입하려 하면 에러가 뜨는 것을 볼 수 있다.

유동적인 크기의 배열을 만들기 위해 vector 헤더를 사용하는 방법도 있겠지만, 지금은 new 와 delete를 이용해 소위 말하는 동적 할당으로 배열을 만드는 법을 알아보자.

 

#include <iostream>

using namespace std;

int main() {
	int arr_size;                     // 배열의 크기 arr_size 선언
	cout << "arr_size : ";
	cin >> arr_size;			// 배열의 크기 arr_size 입력

	int* arr = new int[arr_size]; 		// new로 배열 크기가 arr_size인 int 배열을 생성!

	for (int i = 0; i < arr_size; i++) {
		cin >> arr[i];
	}

	for (int i = 0; i < arr_size; i++) {
		cout << i << "번 째 원소는 : " << arr[i] << endl;

	}

	delete[] arr; 	 // 할당한 메모리 해제 잊지 말기!

	return 0;
}

 

위의 코드를 실행하면 원하는 대로 배열이 입력된 것을 볼 수 있다.

'Language > C++' 카테고리의 다른 글

[C++] 참조자(레퍼런스)  (0) 2022.08.05
[C++] 자료형 개요(작성중)  (0) 2022.08.01
[C++] main 함수란?  (0) 2022.08.01
[C++] 변수 선언  (0) 2022.07.04
[C++] 이름공간(namespace)  (0) 2022.07.04
Comments