# 프로그램에서 메모리가 할당 되는 방법들
- Static memory allocation ( 정적 메모리 할당 )
- 전역변수, 스태틱 변수 같이 한번 만들어지면 끝날 때까지 가지고 있는 것을 의미한다.
- 고정된 메모리.
- 자동 메모리 할당
- 변수를 선언하거나 정적 배열을 선언 했을 때 블록 밖으로 나가면 전부 사라지고 다시 메모리가 할당 되는 것을 의미.
- Dynamic Memory allocation ( 동적 메모리 할당 )
- 필요할 때만 메모리를 할당받아서 사용하고 반납할 수 있다.
# 스택과 힙
#include <iostream>
using namespace std;
int main()
{
int array[1000000]; // 안됨. 이유는? stack -> 정적으로 할당하는 메모리는 스택에 들어감.
return 0;
}
- stack ( 스택 )
- 정적으로 할당되는 메모리는 stack에 들어감.
- stack은 용량이 작음.
- heap ( 힙 )
- 동적으로 할당되는 메모리는 heap에 들어감.
- heap은 용량이 큼.
때문에 동적 메모리 할당을 사용하는게 훨씬 효율적이다.
# 동적으로 메모리 할당 받기 and 메모리 반납하기
#include <iostream>
using namespace std;
int main()
{
int var;
var = 3;
int *ptr = new int;
*ptr = 3;
cout << ptr << endl;
cout << *ptr << endl;
delete ptr; // 동적 메모리 해제
ptr = nullptr; // 아무 의미없는 값이라는 것을 기록.
if (ptr != nullptr) {
cout << ptr << endl;
cout << *ptr << endl;
}
}
- new int;
- new는 C++ 연산자다.
- new + 데이터타입 : 해당 데이터 타입의 크기만큼 힙 메모리를 할당 받아온 후, 주소를 리턴한다.
- int사이즈 ( 4byte ) 에 맞춰서 운영체제로부터 메모리를 받아온 다음, 그 메모리 주소를 알려준다.
- int *ptr = new int;
- 운영체제로부터 받아온 4byte 짜리 메모리 주소가 포인터 변수에 저장됨.
- delete ptr;
- delete는 C++ 연산자다.
- delete 포인터 : 해당 포인터가 가리키고 있는 힙 메모리 영역을 반납한다.
- os에게 해당 메모리를 돌려주는 것. 동적 메모리 해제.
- 하지만, 집주소는 그대로 있기 때문에 출력하면 쓰레기 값이 나옴.
- 출력에서 쓰레기 값이 나오는 것을 방지하기 위해 널포인터로 초기화 시켜주는 습관을 가지자.
- ptr = nullptr;
- delete ptr을 할 때, 변수에 null 값을 넣고 조건문으로 널 값이 아닐 경우에만 출력하게 한다.
- 일종의 트릭.
# 메모리 누수 ( Memory leak )
while(true) {
int *ptr = new ptr;
cout << *ptr << endl;
}
- 다음 반복 때 기존 지역변수 ptr은 사라지고, 새로운 ptr이 선언되기 때문에 기존의 new int는 미아가 된다.
- 주소를 잃어서 메모리를 계속 잡아먹게 되는 것이다. 이게 쌓이면 메모리 과부하가 생긴다.
- 이 문제는 delete 연산자로 기존의 힙 메모리 영역을 os에게 되돌려주어 누수현상을 방지 할 수 있다.
'Coding > C++' 카테고리의 다른 글
[C++] 동적 할당 배열 Dynamically Allocating Array (0) | 2022.08.13 |
---|---|
[ C++ Side Project ] LoginPage 회고 (0) | 2022.03.03 |
[ C++ ] 파일 입출력 ifstream, ofstream, fstream (0) | 2022.03.02 |
[ C++ ] Chapter 6.10 : C언어 스타일의 문자열 심볼릭 상수 (0) | 2022.02.22 |
[ C++ ] Chapter 6.9 : 포인터 연산과 배열 인덱싱 (0) | 2022.02.22 |