Dynamic Memory Allocation
중요한 Part이다.★★★★★
◆ 동적 메모리 할당
● 런타임에 힙 메모리를 할당
☞ 프로그램의 실행 도중 얼마나 많은 메모리가 필요한지 미리 알 수 없는 경우 사용한다.
▶ 사용자 입력에 따라 크기가 바뀌는 경우
▶ 파일을 선택하여 내용을 읽어오는 경우 등
☞ 큰 데이터를 저장해야 할 경우 (Stack 은 크기가 작음, 몇 MB 정도이다.)
☞ 객체의 생애주기(언제 메모리가 할당되고, 해제되어야 할지)를 직접 제어해야 할 경우
(스택에서는 함수가 선언을 마치면 자동으로 해제된다.)
● 힙 메모리는 스택과는 달리 스스로 해제되지 않음!
● 사용이 끝나고 해제하지 않으면 메모리 누수 발생!
● new 연산자 사용
int* int_ptr = nullptr;
int_ptr = new int; // allocate integer in heap
cout << int_ptr << endl; //0000020023556020
cout << &int_ptr << endl; //00000045F93EF918 (Garbage value)
*int_ptr = 100;
cout << *int_ptr << endl; // 100
new 의 역할 (C 언어에서 malloc) Heap 메모리 공간에 int 하나를 담을 수 있는 메모리 주소를 찾고 주소값을 반환한다. |
저번 강의까지는 Stack Memory의 값을 기준으로 배웠으나
new 연산자를 사용하면 Heap Memory에 할당된다.
두 번째 줄 까지 이 상태가 되었다.
*int_ptr = 100으로 선언하면 메모리 상태는 이렇게 된다.
교수님이 그린 이미지는 이렇다.
중요한 Part이다.★★★★★
◆ 동적 메모리 해제
● delete 연산자 사용
int* int_ptr = nullptr;
int_ptr = new int; // allocate integer in heap
cout << int_ptr << endl; //0000020023556020
cout << &int_ptr << endl; //00000045F93EF918
*int_ptr = 100;
cout << *int_ptr << endl; // 100
delete int_ptr; // free
int_ptr = nullptr;
delete의 역할 (C언어의 free) 해당 메모리 공간을 반환한다. |
delete 연산자를 사용한 후 메모리 상태이다.
만일 int_ptr에 null_ptr을 선언하지 않은다면
이렇게 주소값이 있는 상태로 남아있게 된다.
메모리 해제 코드를 작성하지 않고 프로그램 실행 시 프로그램 종료 시 OS에서 해제한다. 하지만 이처럼 OS에 맡기는 것은 큰 프로그램을 개발할 때 적절하지 않다. 프로그램이 종료할 때까지는 계속 할당되어 있기 때문에 프로그램 실행 중에는 계속 메모리 누수 발생하기 때문이다.
cout << *int_ptr << endl; 까지의 int_ptr의 메모리 값이다.
주소값과 {100}으로 메모리 할당되어 있다.
delete int_ptr; 까지의 메모리 값이다.
힙메모리에 있는 100의 값은 해제되었음이 확인되었다.
int_ptr = nullptr; 까지의 메모리 값이다.
Stack 메모리 값까지 메모리 해제가 되었음을 확인할 수 있다.
중요한 Part이다.★★★★★
● new [] , delete [] 연산자 사용
int* array_ptr = nullptr;
int size = 0;
cout << "size of array? " << endl;
cin >> size;
array_ptr = new int[size];
array_ptr[0] = 10;
array_ptr[1] = 20;
array_ptr[2] = 30;
delete[] array_ptr;
array_ptr = nullptr;
new의 역할 (C언어 malloc) Heap 메모리 공간에 int를 size 개수만큼 담을 수 있는 메모리 주소를 찾고 주소값을 반환 |
delete의 역할 (C언어 free) 해당 메모리 공간을 반환 |
array_ptr의 Heap 메모리에 검색하면
10 / 20 / 30이 저장되었음을 알 수 있다.
delete [] array_ptr; 선하게 되면
값들이 해제되었음을 확인할 수 있다.
https://youtu.be/N3 rEzeCxBOs? si=05 K176 UH33 rTy9 aD
'C++ > C++ : Study' 카테고리의 다른 글
C++ 포인터 참조자 (5) 포인터의 전달과 반환 (0) | 2024.09.22 |
---|---|
C++ 포인터 참조자 (4) 배열과 포인터, Const (0) | 2024.09.21 |
C++ 포인터 참조자 (2) 역참조 (1) | 2024.09.16 |
C++ inline function & Recursive Function (0) | 2024.09.15 |
c++ 배열의 전달과 pass-by-reference (0) | 2024.09.11 |