どうてきわりあて
#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;
}
Reference
この問題について(どうてきわりあて), 我々は、より多くの情報をここで見つけました https://velog.io/@sansam41/동적-할당テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol