코드 접은글
// C:\Users\wonhy\Desktop\hansung_study\inflearn_C++\섹션 7.동적 할당
#include<iostream>
using namespace std;
// 오늘의 주제 : 동적할당
/*
메모리 구조 복습
- 실행할 코드가 저장되는 영역 -> 코드 영역
- 전역(global)/정적(static) 변수 -> 데이터영역
- 지역변수/매개변수 -> 스택영역
- 동적 할당 -> 힙영역
지금까진 데이터영역/스택영역을 이용해서 프로그램구성함
but 새로운영역 heap은 왜 필요한걸까
ex)
이유 1.
- MMORPG에서 동접 1~5만명 , 몬스터 1마라~500만마리
이럴 때 5만명 500만마리 의 변수data들을 stack에 전부 저장할 경우
스택 오버플로우가 발생함. 몬스터가 1마리일 수 도 100마리 일 경우가 있잖아
이유 2.
- 스택 영역
함수가 끝나면 같이 정리되는 불안정한 메모리
잠시 함수에 매개변수를 넘긴다던가 하는 용도로 사용됨
- 메모리 영역 (데이터)
프로그램이 실행되는 도중에는 '무조건' 사용되는 영역
3. 결론
따라서 이런 경우 필요시 되는 메모리란?)
(1)- 필요할때만 메모리에 할당하고, 필요없으면 메모리에서 제거할 수 있고
(2)- 스택과 다르게 우리가 메모리에 생성(할당)/소멸 시점을 관리 할 수 도 있고
(1)과 (2)에 해당되는 메모리가 바로 Heap영역
heap영역(동적)에 할당하는 문법은 : (malloc , free) , new , delete , new[] , delete[]
*/
class Monster
{
public:
int _hp;
int _x;
int _y;
};
int main()
{
/* 유저영역 [ 메모리 ] [LOL] [곰플레이어]
-------------------------------------------------
커널영역 (운영체제등의 핵심 코드실행)
heap영역
[ ]
[[1000] 1000byte ] <- malloc할당
[[1000] Monster ] <- 1000byte에 몬스터class 할당
C++에서는 기본적으로 CRT(C런타임 라이브러리)의 [힙 관리자]를 통해 힙 영역 사용함
단, 정말 원한다면 우리가 직접 API를 통해 heap을 생성하고 관리할 수 있다.(ex)MMORPG 서버 메모리 풀링 같은)
*/
typedef unsigned int size_t; //unsigned int를 size_t 로 치환해서 사용
//unsigned는 -말고 +만 받는 int형 자료형
//======================================================================================================================
void* p_1 = malloc(1000);
//1000byte를 heap에 할당하고 그 시작주소를 p_1에 저장한다.
//그런데 여기서 void* ?? 뭘까
//일단 * 이니까 포인터임
//타고가면 void 아무것도 없는 자료형? ㄴㄴ아님
//타고가서 void 뭐가 있을지 모르니까 알아서 변환해서 사용좀 해라 임
//활용 p_1시작부터 1000byte의 heap영역을 Monster클래쓰용도로 사용하려면??
Monster* m1 = (Monster*)p_1;
m1->_hp = 100;
m1->_x = 1;
m1->_y = 2;
//class Monster를 1000byte 힙영역에 할당함.
//======================================================================================================================
//======================================================================================================================
//여기서 Monster사이즈는 얼마안되는데 1000byte는 낭비임
void* p_2 = malloc(sizeof(Monster)); // Monster사이즈만큼만 heap할당
//할당된거 소멸시킴
//다른영역(stack,code,data영역등등)들은 프로그램 종료까지 메모리할당 소멸 불가능
free(p_1);
free(p_2);
//======================================================================================================================
//======================================================================================================================
void* p_3 = malloc(12);
Monster* m2 = (Monster*)p_3;
m2->_hp = 1;
m2->_x = 2;
m2->_y = 3;
printf("debug point");
free(p_3);
//User-After-Free 문제
//p_1~3 값 m1~2값에 주소값이 들어가있다.
//이부분을 이용해서 다른 data접근이 가능 -> 해킹당할 위험 UP
//따라서 이런 사용이 끝난 주소들을 nullptr로 밀어주는 작업을 함
p_1, p_2, p_3 = nullptr;
m1, m2 = nullptr;
//======================================================================================================================
return 0;
}
메모리 구조 복습
- 실행할 코드가 저장되는 영역 -> 코드 영역
- 전역(global)/정적(static) 변수 -> 데이터영역
- 지역변수/매개변수 -> 스택영역
- 동적 할당 -> 힙영역
지금까진 데이터영역/스택영역을 이용해서 프로그램구성함
but 새로운영역 heap은 왜 필요한걸까
ex)
이유 1.
- MMORPG에서 동접 1~5만명 , 몬스터 1마라~500만마리
이럴 때 5만명 500만마리 의 변수data들을 stack에 전부 저장할 경우
스택 오버플로우가 발생함. 몬스터가 1마리일 수 도 100마리 일 경우가 있잖아
이유 2.
- 스택 영역
함수가 끝나면 같이 정리되는 불안정한 메모리
잠시 함수에 매개변수를 넘긴다던가 하는 용도로 사용됨
- 메모리 영역 (데이터)
프로그램이 실행되는 도중에는 '무조건' 사용되는 영역
3. 결론
따라서 이런 경우 필요시 되는 메모리란?)
(1)- 필요할때만 메모리에 할당하고, 필요없으면 메모리에서 제거할 수 있고
(2)- 스택과 다르게 우리가 메모리에 생성(할당)/소멸 시점을 관리 할 수 도 있고
(1)과 (2)에 해당되는 메모리가 바로 Heap영역
heap영역(동적)에 할당하는 문법은 : (malloc , free) , new , delete , new[] , delete[]
/* 유저영역 [ 메모리 ] [LOL] [곰플레이어]
-------------------------------------------------
커널영역 (운영체제등의 핵심 코드실행)
heap영역
[ ]
[[1000] 1000byte ] <- malloc할당
[[1000] Monster ] <- 1000byte에 몬스터class 할당
C++에서는 기본적으로 CRT(C런타임 라이브러리)의 [힙 관리자]를 통해 힙 영역 사용함
단, 정말 원한다면 우리가 직접 API를 통해 heap을 생성하고 관리할 수 있다.(ex)MMORPG 서버 메모리 풀링 같은)
*/
typedef unsigned int size_t; //unsigned int를 size_t 로 치환해서 사용
//unsigned는 -말고 +만 받는 int형 자료형
void* p_1 = malloc(1000);
//1000byte를 heap에 할당하고 그 시작주소를 p_1에 저장한다.
//그런데 여기서 void* ?? 뭘까
//일단 * 이니까 포인터임
//타고가면 void 아무것도 없는 자료형? ㄴㄴ아님
//타고가서 void 뭐가 있을지 모르니까 알아서 변환해서 사용좀 해라 임
//활용 p_1시작부터 1000byte의 heap영역을 Monster클래쓰용도로 사용하려면??
Monster* m1 = (Monster*)p_1;
m1->_hp = 100;
m1->_x = 1;
m1->_y = 2;
//class Monster를 1000byte 힙영역에 할당함.
//여기서 Monster사이즈는 얼마안되는데 1000byte는 낭비임
void* p_2 = malloc(sizeof(Monster)); // Monster사이즈만큼만 heap할당
메모리영역 확인
heap영역에 동적으로 할당을 하면,
헤더영역(p_3할당주소 전 12byte메모리영역)에 컨닝처럼 할당된byte사이즈(9)가 있다.
글고 p_3주소부터 4byte씩 변수에 들어간 정수값이 1,2,3 들어가있는걸 볼 수 있다.
그리고 여기서 문제는 *p_3에 9byte만 heap영역에 할당 했는데 이러면 heap영역 오버플러우 에러남
왜냐면 변수 3개라 12byte인데 9byte만 할당했으므로 OverFlow임
'C++,python (인프런+사이트) > C++ 동적 할당' 카테고리의 다른 글
타입변환_1_2 (0) | 2022.03.08 |
---|---|
동적할당_3_(new[]/delete[]) (0) | 2022.02.07 |
댓글