포스트

동적 메모리 할당 & 해제 (new & delete)

이 글은 제 개인적인 공부를 위해 작성한 글입니다.
틀린 내용이 있을 수 있고, 피드백은 환영합니다.

new & delete 키워드


new와 delete 키워드는 C++에서 동적 메모리 할당과 해제를 위해 사용되는 키워드이다.

new 키워드

  • 메모리 공간을 동적으로 할당
  • 메모리 할당 실패 시 std::bad_alloc 예외가 던져지고 프로그램이 종료된다.

    하지만 매개변수로 std::nothrow를 넘기면 메모리 할당 실패 시 예외가 던져지지 않고, 대신 nullptr이 반환된다.

  • 함수 원형
1
2
3
4
5
6
7
// 1. 단일 객체 메모리를 동적으로 할당
void* operator new(size_t _Size)
void* operator new(size_t _Size, std::nothrow_t const&) noexcept

// 2. 배열을 동적으로 할당
void* operator new[](size_t _Size)
void* operator new[](size_t _Size, std::nothrow_t const&) noexcept

delete 키워드

  • 동적으로 할당 받은 메모리 공간을 해제
  • 함수 원형
1
2
3
4
5
6
7
8
9
10
11
// 1. 단일 객체 메모리 해제
void operator delete(void* _Block)

// 2. 배열 메모리 해제
void operator delete[](void* _Block)

// 아래 4개는 생성자에서 예외가 발생했을 때만 사용된다.
void operator delete(void* _Block, std::nothrow_t const&) noexcept
void operator delete[](void* _Block, std::nothrow_t const&) noexcept
void operator delete(void* _Block, size_t _Size)
void operator delete[](void* _Block, size_t _Size)


사용법


단일 객체 & 1차원 배열

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <new>
using namespace std;

int main()
{
	// 단일 객체 메모리 할당 & 할당 실패 시 std::badalloc 예외
	int* ptr = new int;
	// 단일 객체 메모리 할당 & 할당 실패 시 예외 대신 nullptr 반환
	int* ptr = new(nothrow) int;
	
	// 배열 메모리 할당 & 할당 실패 시 std::badalloc 예외
	int* ptr = new int[5];
	// 배열 메모리 할당 & 할당 실패 시 예외 대신 nullptr 반환
	int* ptr = new(nothrow) int[5];

	// 단일 객체 메모리 해제
	delete ptr;
	
	// 배열 메모리 해제
	delete[] ptr;
}

2차원 배열

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
int rows = 3;
int cols = 4;

int** arr = new int* [rows];
// auto arr = new int* [rows]; // C++ 11 이상부터는 auto 키워드 가능

for (int i = 0; i < rows; i++)
{
	arr[i] = new int[cols]();
}

for (int i = 0; i < rows; ++i) 
{
	for (int j = 0; j < cols; ++j) 
	{
		cout << arr[i][j] << ' ';
	}
	cout << endl;
}

for (int i = 0; i < rows; ++i) 
{
	delete[] arr[i]; // 각 행 메모리 해제
}
delete[] arr; // 포인터 배열 메모리 해제


참고


이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.