どうてきわりあて


#include <iostream>

#include<iomanip>

using namespace std;

//동적할당

//메모리 구조 복습

//- 실행할 코드가 저장되는 영역 -> 코드 영역

//- 전역(global)/정적(static) 변수 -> 데이터 영역

//- 지역 변수/매개 변수 -> 스택 영역

//- 동적 할당 -> 힙 영역

//실제 상황)

//- MMORPG 동점 1명~5만명, 몬스터 1마리~500만마리

//- 최대 몬스터를 미리 만들어둘 필요는 없다.

//- 몬스터 생성 이벤트 -> 5분동안 몬스터가 10배 많이 나옴

//-스택 영역

// 함수가 끝나면 같이 정리되는 불안정한 메모리

// 잠시 함수에 매개변수 넘긴다거나, 하는 용도로는 OK

//-메모리 영역

// 프로그램이 실행되는 도중에는 무조건 사용됨

//희망사항)

//-필요할 때만 사용, 필요없으면 반납!

//-그러면서도 (스택과는 다르게) 우리가 생성/소멸 시점을 관리할 수 있는!

//-그런 아름다운 메모리 -> HEAP

//동적할당과 연관된 함수/연산자 : malloc/ free, new/ delete, new[]/ delete[]

//malloc

//-할당할 메모리 크기를 건내준다

//-메모리 할당 후 시작 주소를 가리키는 포인터를 반환해준다 (메모리 부족 NULL)

//free

//-malloc(혹은 기타  calloc, realloc 등의 사촌)을 통해 할당된 영역을 해제

//-힙 관리자가 할당/미할당 여부를 구분해서 관리.

//new / delete

//- C++에서 추가됨

//- malloc / free는 함수!

//- new / delete는 연산자(operator)

//new[] / delete[]

//-new 가 malloc에 비해 좋긴 한데 배열같이 N개 데이터를 같이 할당하려면?

// => new[]를 사용.

//malloc_free vs new_delete

//사용 편의성은 new_delete 승!

//타입에 상관없이 특정한 크기의 메모리 영역을 할당 받으려면? -> malloc_free 승!

//그런데 둘의 가장 큰 차이는?

//new/delete는 (생성타입이 클래스일 경우) 생성자/소멸자를 호출해준다!

class Monster {

public :

 Monster() { cout << "생성자 호출" << endl; }

 ~Monster() { cout << "소멸자 호출" << endl; }

public:

 int _hp;

 int _x;

 int _y;

};

int main()

{

 //스택은 함수들 끼리 인자들을 주고 받도록 만들었기 때문에\

 //큰 데이터를 할당하는것은 옳지 않다

 //Monster monster[500 * 10000]; //Stack Overflow발생

 //유저 영역(메모장, LOL 등 일반 프로그램)

 //-------------------------------------

 //커널 영역(windows 등의 핵심 코드)

 //유저 영역) 운영체제에서 제공하는 API 호출

 //커널 영역) 메모리 할당해서 건내줌

 //유저 영역) ㄳㄳ 잘쓸게요~

 // C++에서는 기본적으로 CRT(C런타임 라이브러리)의 [힙 관리자]를 통해 힙 영역 사용

 // 단, 정말 원한다면 우리가 직접 api를 통해 힙을 생성하고 관리할 수도 있음(MMORPG 서버 메모리 풀링)

 // malloc & free

 //void* 는 무엇인가?

 //*가 있으니까 포인터는 포인터(주소를 담는 바구니) => OK

 //타고 가면 void 아무것도 없다? => NO

 //타고가면 void 뭐가 있는지 모르니 너가 적당히 변환해서 사용해라!=> OK

 void* pointer=malloc(sizeof(Monster));

 Monster* m1 = (Monster*)pointer;

 m1->_hp = 100;

 m1->_x = 1;

 m1->_y = 2;

 //Heap Overflow

 //- 유효한 힙 범위를 초과해서 사용하는 문제

 //- 타입변환에서 문제 발생

 //만약에 free하지 않으면 메모리 누수가 발생

 free(pointer); //메모리 해제

 pointer = nullptr;

 m1 = nullptr;

 //Double Free

 //-이건 대부분 그냥 크래시만 난다

 //free(pointer)

 //Use-After-Free

 //프로그래머 입장 : 망했다

 //해커입장 : 심봤다!

 //m1->_hp = 100;

 //m1->_x = 1;

 //m1->_y = 2;

 // new & delete

 Monster* m2 = new Monster;

 m2->_hp = 100;

 m2->_x = 1;

 m2->_y = 2;

 delete m2;

 // new[] & delete[]

 // 배열같은 느낌으로 여러개를 만듦

 Monster* m3 = new Monster[5];

 m3->_hp = 100;

 m3->_x = 1;

 m3->_y = 2;

 Monster* m4 = (m3 + 1);

 m4->_hp = 100;

 m4->_x = 1;

 m4->_y = 2;

 delete[] m3;

 return 0;

}