동적 메모리 할당 & 해제 (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 라이센스를 따릅니다.