Notice
Recent Posts
Recent Comments
Link
오븐 노트
[C++] 동적할당 #2 본문
#include <iostream>
using namespace std;
// 메모리 구조 복습
// - 실행할 코드가 저장되는 영역 -> 코드 영역
// - 전역(global)/정적(static) 변수 -> 데이터 영역
// - 지약 변수/매개 변수 -> 스택 영역
// - 동적 할당 -> 힙 영역
// ex)
// - MMORPG 동접 1명-5만명, 몬스터 1마리-500만 마리
// - 몬스터 생성 이벤트 -> 5분 동안 몬스터 10배
// - 스택 영역
// -- 함수가 끝나면 같이 정리되는 불안정한 메모리
// -- 잠시 함수에 매개변수를 넘긴다거나 잠깐 사용하는 용도로는 좋음
// - 메모리 영역
// -- 프로그램이 실행되는 도중에는 무조건 사용되고 있는 영역
// - 힙 영역
// -- 필요할 때만 사용하고, 필요없으면 반납할 수 있는
// -- 스택과는 다르게 우리가 생성 / 소멸 시점을 관리
// 동적 할당과 연관된 함수 / 연산자 : malloc, free, new, delete, new[], delete[]
// malloc
// - 할당할 메모리 크기를 건내준다
// - 메모리 할당 후 시작 주소를 가리키는 포인터를 반환해준다 (메모리 부족 NULL)
// free
// - malloc (혹은 기타 calloc, realloc 등)을 통해 할당된 영역을 해제
// - 힙 관리자가 할당.미할당 여부를 구분해서 관리
class Monster
{
public:
int _hp;
int _x;
int _y;
};
int main()
{
// Monster monster[500 * 10000]; // 스택 오버플로우. 전역으로 옮기면 해결되지만 항상 고정된 메모리를 요구하므로 낭비가 심함.
// 유저 영역 [메모장] [LOL] [곰플레이어] 등 일반적인 프로그램
// ---------------------------------------
// 커널 영역 (Windows 등의 핵심 코드)
// 동적 할당 대체적인 움직임
// 유저 영역 ) 운영체제에서 제공하는 API 호출
// 커널 영역 ) 메모리를 할당하여 건네줌
// 유저 영역 ) 받음
// C++에서는 기본적으로 CRT(C런타임 라이브러리)의 [힙 관리자]를 통해 힙 영역 사용
// 단, 정말 원한다면 우리가 직접 API를 통해 힙을 생성하고 관리 할 수 있음 (MMORPG 서버 메모리 풀링)
//void* ??
// * -> 포인터
// 포인터를 타고가면 void. 즉, 어떤 값이 있는지 알 수 없으니 알아서 변환하여 사용하라.
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; // Use-After_free 방지
m1 = nullptr; // Use-After_free 방지
// Double Free
// - 대부분 단순 크래시만 나고 끝남
//free(pointer);
// Use-After_free
// - free를 했지만 pointer 변수에 주소를 들고있기는 하기 때문에 해당 주소를 건드릴 수 있는 상황
// - 당장 크래시가 나타나지 않기 때문에 추후에 큰 파장이 일어날 수 있음. 주의.
return 0;
}
[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 - 인프런 | 강의
C++ 카테고리의 글은 인프런 Rookiss님의 강의를 공부하며 정리하는 내용입니다.
이미 알고 있는 내용도 다시 정리 되어있을 수 있습니다.
모든 글은 제가 공부하기 위해 작성합니다.
'Develop > C++' 카테고리의 다른 글
[C++] 타입 변환 #1~2 (0) | 2023.02.13 |
---|---|
[C++] 동적할당 #3 (0) | 2023.02.08 |
[C++] 동적 할당 #1 (0) | 2022.10.06 |
[C++] 객체지향 마무리 (0) | 2022.10.06 |
[C++] 연산자 오버로딩 #1 ~ 2 (0) | 2022.10.05 |