일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 26 | 27 | 28 |
29 | 30 | 31 |
- SQL
- 문제풀이
- 백준알고리즘
- 프로그래머스
- python
- softeer
- 시나공
- BFS
- 정보처리산업기사
- 스프링
- 공부일지
- 코딩봉사
- CJ UNIT
- 데이터베이스
- 코딩교육봉사
- C++
- 자바
- 백준 알고리즘
- MYSQL
- SW봉사
- kotlin
- 회고
- 파이썬
- 코틀린
- java
- 1과목
- 소프티어
- 알고리즘
- programmers
- 백준
- Today
- Total
JIE0025
[ C++ ] 동적 할당 깊이 파기 (구조 이해) 본문
동적할당을 알기 전에 먼저 프로그램이 실행되고 동작하는 원리를 알아보자.
CPU, RAM(주기억장치), HDD(하드디스크/보조기억장치), OS(운영체제) 가 있다.
1) 사용자는 OS(운영체제)를 통해 프로그램의 실행을 요청한다.
2) 하드디스크에 저장되어 있던 program의 정보를 읽어 RAM, 메모리의 프로그램 코드 영역에 올려둔다.
3) CPU는 program code를 읽어서 메모리를 관리, 명령문을 실행한다.
4) 프로그램 실행을 위한 동적메모리 할당시 Free Store 영역을 사용 (아래로 확장)
5) system 작동을 위해 CPU가 임시 정보를 스택에 저장시 Free Store 영역을 사용 (위로 확장)
- 만약 Heap과 Stack메모리를 많이 사용해 Free Store영역이 없어지면 메모리 부족 상태가 됨
RAM 주기억장치 영역별 데이터에 관한 내용은 과거에도 쓴적이 있다.
https://jie0025.tistory.com/176?category=1023432
그래도 다시 언급하자면,
메모리 영역별 특징
Program code | 실행한 프로그램의 코드가 저장 |
Data | 전역변수, static 변수 >>>> program 종료시까지 남아있음 |
Heap | 동적 할당된 메모리 영역 c++ new 와 c언어 malloc , c++ delete와 c언어 free 를 사용해 프로그래머가 할당, 해제 한다. |
Stack | 지역변수와 매개변수가 할당, 함수 종료시 자동 소멸 |
static 메모리 : 데이터영역에 저장, 지속적
heap 메모리 : heap영역에 저장, 지속적, 프로그래머의 관리 필요(해제)
stack 메모리 : stack영역에 저장, 함수 빠져나갈경우 자동 소멸
정적 메모리 : 전역변수, static변수, 지역변수, 매개변수의 저장
동적할당을 하는 이유
1) 일시적으로 많은 메모리를 잡아야 할때 사용한다.
프로그램을 실행하면 RAM 에 올라가서 돌게 되는데 RAM의 메모리 자원은 한정적이다.
프로세스가 많은 메모리가 필요한 상황에서 처음부터 끝까지 계속 공간을 차지하면 메모리 낭비가 일어난다.
따라서 메모리를 사용할때만 잡고 다시 해지시킴으로 메모리 할당 함으로써 메모리공간을 효율적으로 사용하게 된다.
2) 함수 리턴 이후에도 메모리 할당이 살아있게 하고 싶은 경우에 사용
(지역변수 사용시 함수 종료후 사라지기 때문에)
3) 그때그때 메모리를 요청하기 위해 : vector 와 같은 것들..
동적할당 특징
1) 꼭 쌍을 맞춰서 사용해야한다. (일부만 해제되는 문제발생 가능)
- malloc 사용시 free
- new사용시 delete
- new[] 사용시 delete[]
2) 메모리 해제후 포인터의 경우 NULL로 초기화해 에러 방지.
int *data = new int;
int *arr = new int[10];
delete data;
delete[] arr;
2차원 배열의 동적할당
mat 는 int**
mat[i] 는 int *
mat[i][k] 는 int형
2차원 동적 배열을 해줄 경우 loop를 돌면서 일일이 할당과 해제를 해야한다.
근데 그냥 vector를 써버리는게 제일 편함!
'기타 학습 > Language' 카테고리의 다른 글
[ C++ ] 문자열을 숫자로 (stoi, stof, stol, stod) (0) | 2022.05.19 |
---|---|
[ C++ ] 문자열 치환 replace, regex_replace (0) | 2022.05.19 |
[ c++ ] cmath 라이브러리 (0) | 2022.05.17 |
[ C++ ] this 포인터 (0) | 2022.05.17 |
[ C++ ] 객체 배열, 객체 포인터 배열 (0) | 2022.05.17 |