오븐 노트

[C++] 동적할당 #2 본문

Develop/C++

[C++] 동적할당 #2

오 븐 2023. 2. 1. 19:41
#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