본문 바로가기
C++,python (인프런+사이트)/C++ 동적 할당

동적할당_1_2_(malloc_free)

by 알 수 없는 사용자 2022. 2. 2.

코드 접은글

더보기
더보기
// C:\Users\wonhy\Desktop\hansung_study\inflearn_C++\섹션 7.동적 할당
#include<iostream>
using namespace std;

// 오늘의 주제 : 동적할당

/*
메모리 구조 복습
- 실행할 코드가 저장되는 영역       -> 코드 영역
- 전역(global)/정적(static) 변수 -> 데이터영역
- 지역변수/매개변수               -> 스택영역
- 동적 할당                     -> 힙영역

지금까진 데이터영역/스택영역을 이용해서 프로그램구성함
but 새로운영역 heap은 왜 필요한걸까

ex)
이유 1.
- MMORPG에서 동접 1~5만명 , 몬스터 1마라~500만마리
이럴 때  5만명 500만마리 의 변수data들을 stack에 전부 저장할 경우
스택 오버플로우가 발생함. 몬스터가 1마리일 수 도 100마리 일 경우가 있잖아

이유 2.
- 스택 영역
함수가 끝나면 같이 정리되는 불안정한 메모리
잠시 함수에 매개변수를 넘긴다던가 하는 용도로 사용됨
- 메모리 영역 (데이터)
프로그램이 실행되는 도중에는 '무조건' 사용되는 영역

3. 결론
따라서 이런 경우 필요시 되는 메모리란?)
(1)- 필요할때만 메모리에 할당하고, 필요없으면 메모리에서 제거할 수 있고
(2)- 스택과 다르게 우리가 메모리에 생성(할당)/소멸 시점을 관리 할 수 도 있고
(1)과 (2)에 해당되는 메모리가 바로 Heap영역
heap영역(동적)에 할당하는 문법은 : (malloc , free) , new , delete , new[] , delete[]





*/

class Monster
{
public:
    int _hp;
    int _x;
    int _y;
};

int main()
{
    /*  유저영역 [ 메모리 ] [LOL] [곰플레이어]
        -------------------------------------------------
        커널영역 (운영체제등의 핵심 코드실행)

        heap영역
        [                                   ]
        [[1000] 1000byte ] <- malloc할당
        [[1000] Monster  ] <- 1000byte에 몬스터class 할당
        C++에서는 기본적으로 CRT(C런타임 라이브러리)의 [힙 관리자]를 통해 힙 영역 사용함
        단, 정말 원한다면 우리가 직접 API를 통해 heap을 생성하고 관리할 수 있다.(ex)MMORPG 서버 메모리 풀링 같은)
    */

    typedef unsigned int size_t; //unsigned int를 size_t 로 치환해서 사용
    //unsigned는 -말고 +만 받는 int형 자료형

//======================================================================================================================
    void* p_1 = malloc(1000);
    //1000byte를 heap에 할당하고 그 시작주소를 p_1에 저장한다.
    //그런데 여기서 void* ?? 뭘까
    //일단 * 이니까 포인터임
    //타고가면 void 아무것도 없는 자료형? ㄴㄴ아님
    //타고가서 void 뭐가 있을지 모르니까 알아서 변환해서 사용좀 해라 임


    //활용 p_1시작부터 1000byte의 heap영역을 Monster클래쓰용도로 사용하려면??
    Monster* m1 = (Monster*)p_1;
    m1->_hp = 100;
    m1->_x = 1;
    m1->_y = 2;
    //class Monster를 1000byte 힙영역에 할당함.
//======================================================================================================================



//======================================================================================================================
    //여기서 Monster사이즈는 얼마안되는데 1000byte는 낭비임
    void* p_2 = malloc(sizeof(Monster)); // Monster사이즈만큼만 heap할당


    //할당된거 소멸시킴
    //다른영역(stack,code,data영역등등)들은 프로그램 종료까지 메모리할당 소멸 불가능
    free(p_1);
    free(p_2);
//======================================================================================================================



//======================================================================================================================
    void* p_3 = malloc(12);
    Monster* m2 = (Monster*)p_3;
    m2->_hp = 1;
    m2->_x = 2;
    m2->_y = 3;

    printf("debug point");

    free(p_3);

    //User-After-Free 문제
    //p_1~3 값 m1~2값에 주소값이 들어가있다.
    //이부분을 이용해서 다른 data접근이 가능 -> 해킹당할 위험 UP
    //따라서 이런 사용이 끝난 주소들을 nullptr로 밀어주는 작업을 함
    p_1, p_2, p_3 = nullptr;
    m1, m2 = nullptr;
//======================================================================================================================

    return 0;
}

메모리 구조 복습
- 실행할 코드가 저장되는 영역       -> 코드 영역
- 전역(global)/정적(static) 변수 -> 데이터영역
- 지역변수/매개변수               -> 스택영역
- 동적 할당                     -> 힙영역

지금까진 데이터영역/스택영역을 이용해서 프로그램구성함
but 새로운영역 heap은 왜 필요한걸까

ex)
이유 1.
- MMORPG에서 동접 1~5만명 , 몬스터 1마라~500만마리
이럴 때  5만명 500만마리 의 변수data들을 stack에 전부 저장할 경우
스택 오버플로우가 발생함. 몬스터가 1마리일 수 도 100마리 일 경우가 있잖아

이유 2.
- 스택 영역
함수가 끝나면 같이 정리되는 불안정한 메모리
잠시 함수에 매개변수를 넘긴다던가 하는 용도로 사용됨
- 메모리 영역 (데이터)
프로그램이 실행되는 도중에는 '무조건' 사용되는 영역

3. 결론
따라서 이런 경우 필요시 되는 메모리란?)
(1)- 필요할때만 메모리에 할당하고, 필요없으면 메모리에서 제거할 수 있고
(2)- 스택과 다르게 우리가 메모리에 생성(할당)/소멸 시점을 관리 할 수 도 있고
(1)과 (2)에 해당되는 메모리가 바로 Heap영역
heap영역(동적)에 할당하는 문법은 : (malloc , free) , new , delete , new[] , delete[]

 

 

 

    /*  유저영역 [ 메모리 ] [LOL] [곰플레이어]
        -------------------------------------------------
        커널영역 (운영체제등의 핵심 코드실행)

        heap영역
        [                                   ]
        [[1000] 1000byte ] <- malloc할당
        [[1000] Monster  ] <- 1000byte에 몬스터class 할당
        C++에서는 기본적으로 CRT(C런타임 라이브러리)의 [힙 관리자]를 통해 힙 영역 사용함
        단, 정말 원한다면 우리가 직접 API를 통해 heap을 생성하고 관리할 수 있다.(ex)MMORPG 서버 메모리 풀링 같은)
    */

    typedef unsigned int size_t; //unsigned int를 size_t 로 치환해서 사용
    //unsigned는 -말고 +만 받는 int형 자료형


    void* p_1 = malloc(1000);
    //1000byte를 heap에 할당하고 그 시작주소를 p_1에 저장한다.
    //그런데 여기서 void* ?? 뭘까
    //일단 * 이니까 포인터임
    //타고가면 void 아무것도 없는 자료형? ㄴㄴ아님
    //타고가서 void 뭐가 있을지 모르니까 알아서 변환해서 사용좀 해라 임


    //활용 p_1시작부터 1000byte의 heap영역을 Monster클래쓰용도로 사용하려면??
    Monster* m1 = (Monster*)p_1;
    m1->_hp = 100;
    m1->_x = 1;
    m1->_y = 2;
    //class Monster를 1000byte 힙영역에 할당함.

   

    //여기서 Monster사이즈는 얼마안되는데 1000byte는 낭비임
    void* p_2 = malloc(sizeof(Monster)); // Monster사이즈만큼만 heap할당

 

메모리영역 확인

heap영역에 동적으로 할당을 하면,

헤더영역(p_3할당주소 전 12byte메모리영역)에 컨닝처럼 할당된byte사이즈(9)가 있다.

 

글고 p_3주소부터 4byte씩 변수에 들어간 정수값이 1,2,3 들어가있는걸 볼 수 있다.

 

그리고 여기서 문제는 *p_3에 9byte만 heap영역에 할당 했는데 이러면 heap영역 오버플러우 에러남

왜냐면 변수 3개라 12byte인데 9byte만 할당했으므로 OverFlow임

'C++,python (인프런+사이트) > C++ 동적 할당' 카테고리의 다른 글

타입변환_1_2  (0) 2022.03.08
동적할당_3_(new[]/delete[])  (0) 2022.02.07

댓글