오븐 노트

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

Develop/C++

[C++] 동적할당 #3

오 븐 2023. 2. 8. 05:22
#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 등)을 통해 할당된 영역을 해제
// - 힙 관리자가 할당.미할당 여부를 구분해서 관리

// new / delete
// - C++에 추가됨
// - malloc / free는 함수 new / delete는 연산자 (operator)

// new[] / delete[]
// - new를 사용하려고 할 때 배열과 같이 N개 데이터를 같이 할당하려면 [] 사용 필요

// malloc / free vs new / delete
// - 사용 편의성 -> new / delete
// - 타입에 상관 없이 특정한 크기의 메모리 영역을 할당 받으려면 -> malloc / free

// 둘의 가장 근본적인 차이는
// new / delete는 생성타입이 클래스일 경우 생성자 / 소멸자를 호출해준다

class Monster
{
public:
    Monster()
    {
        cout << "Monster()" << endl;
    }
    
    ~Monster()
    {
        cout << "~Monster()" << endl;
    }

public:
    int _hp;
    int _x;
    int _y;
};

int main()
{
    // Monster monster[500 * 10000]; // 스택 오버플로우. 전역으로 옮기면 해결되지만 항상 고정된 메모리를 요구하므로 낭비가 심함.

    // 유저 영역 [메모장] [LOL] [곰플레이어] 등 일반적인 프로그램
    // ---------------------------------------
    // 커널 영역 (Windows 등의 핵심 코드)

    // 동적 할당 대체적인 움직임
    // 유저 영역 ) 운영체제에서 제공하는 API 호출
    // 커널 영역 ) 메모리를 할당하여 건네줌
    // 유저 영역 ) 받음

    // C++에서는 기본적으로 CRT(C런타임 라이브러리)의 [힙 관리자]를 통해 힙 영역 사용
    // 단, 정말 원한다면 우리가 직접 API를 통해 힙을 생성하고 관리 할 수 있음 (MMORPG 서버 메모리 풀링)

    //void* ??
    // * -> 포인터
    // 포인터를 타고가면 void. 즉, 어떤 값이 있는지 알 수 없으니 알아서 변환하여 사용하라.
    
    // ※※※ 메모리 할당 주요 문법 start ※※※
    void* pointer = malloc(12);    
    Monster* m1 = (Monster*)pointer;
    m1->_hp = 100;
    m1->_x = 1;
    m1->_y = 2;
    // Heap Overflow
    // - 유효한 힙 범위를 초과해서 사용하는 문제
    // 만약 free 하지 않는다면 메모리 누수
    free(pointer);
    
    Monster* m2 = new Monster;
    m2->_hp = 200;
    m2->_x = 2;
    m2->_y = 3;
    delete m2;
    // ※※※ 메모리 할당 주요 문법 end ※※※

    Monster* m3 = new Monster[5];
    m3->_hp = 200;
    m3->_x = 2;
    m3->_y = 3;

    Monster* m4 = (m3 + 1);
    m4->_hp = 300;
    m4->_x = 4;
    m4->_y = 5;

    delete[] m3;

    return 0;
}

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 - 인프런 | 강의
 
C++ 카테고리의 글은 인프런 Rookiss님의 강의를 공부하며 정리하는 내용입니다.
이미 알고 있는 내용도 다시 정리 되어있을 수 있습니다.

 

모든 글은 제가 공부하기 위해 작성합니다.

'Develop > C++' 카테고리의 다른 글

[C++] 타입 변환 #3  (0) 2023.02.15
[C++] 타입 변환 #1~2  (0) 2023.02.13
[C++] 동적할당 #2  (0) 2023.02.01
[C++] 동적 할당 #1  (0) 2022.10.06
[C++] 객체지향 마무리  (0) 2022.10.06