본문 바로가기
프로그래밍/c++

동적할당

by 오늘의논리 2023. 3. 1.
728x90

동적  할당이란?

  • 필요할때만 사용하고, 필요없으면 반납할수 있는!
  • 그러면서도 (스택과는 다르게) 우리가 생성/소멸 시점을 관리할수 있는!
  • 그런 아름다운 메모리 없나? -> HEAP
  • 동적할당과 연관된 함수/연산자 : malloc, free, new, delete, new[]. delete[]

 

유저 영역[메모장][게임][곰플레이어 등]

-------------------------------------------------

커널 영역(Windows 등의 핵심 코드)

 

컴퓨터가 위 처럼 실행되고 있다고 한다면

 

유저영역) 운영체제에서 제공하는 API 호출

커널영역) 메모리 할당해서 건내줌

유저영역) 건네준 메모리 잘사용

 

C++에서는 기본적으로 CRT(C런타임 라이브러리) [힙관리자]를 통해 힙 영역 사용

, 정말 원한다면 우리가 직접 API를 통해 힙을 생성하고 관리할 수도 있음

 

malloc

  • 할당한 메모리 크기를 건내준다
  • 메모리 할당 후 시작 주소를 가리키는 포인터를 반환해준다 (메모리 부족시 NULL 반환)
  • void*은 타고가면 뭐가있는지 모르겠으니까 니가 적당히 변환해서 사용해라 라는 의미로 사용

 

 

class Monster
{

public:
    int _hp;
    int _attack;
    int _defence;

};


int main()
{
    void* pointer = malloc(1000); // 1000바이트 힙 메모리를 할당받음
    Monster* m1 = (Monster*)pointer;
    
    m1->_hp = 100;
    m1->_attack = 10;
    m1->_defence =1;

    return 0;

}

 

void* pointer = malloc(1000); 부분이 메모리가 낭비가 될수도 있으니

void* pointer = malloc(sizeof(Monster)); 이렇게 하면 낭비가 되지 않음
 

free

  • malloc(혹은 기타 calloc, realloc 등의 사촌 을 통해 할당된 영역을 해제
  • 힙 관리자가 할당/ 미할당 여부를 구분해서 관리
  • free(pointer); = 메모리를 더이상 사용하지 않을테니 놓아줘!

 

free 사용하지 않으면 메모리 누수가 발생함

free 두번 사용하면 Double Free 라고 하는데 크래시가 나게됨.

 

**Use-After-Free**

 크래시가 나지않고 다른메모리를 건드리게 될경우

  • 프로그래머 입장 : OMG 망했다.
  • 해커 입장 : 심봤다

그렇기 때문에 m1 = nullptr; 등을 넣어줘 메모리를 정리해야한다.

 

new / delete

  • C++ 추가됨
  • malloc / free 함수처럼 new/delete 연산자(operator)! 짝지어서 써줘야함
  • malloc / free 비슷한 버그들은 공통적으로 존재

new[ ] / delete [ ]

  • new malloc 비해 좋긴한데 배열과 같이 N 데이터를 같이 할당할때 사용

 

int main()
{        

    Monster* m2 = new Monster;//타입의 크기만큼 할당해줌
    
    m2->_hp = 200;
    m2->_attack = 20;
    m2->_defence = 2;

    delete m2;


    Monster* m3 = new Monster[5]; //타입의 크기만큼 5개를 할당해줌

    m2->_hp = 300;
    m2->_attack = 30;
    m2->_defence = 3;

    delete[] m3;

	return 0;
}

 

이전에 배운 포인터 연산자를 이용하면

 

Monster* m4 = (m3 + 1); 의미는 m3 다음 주소를 사용하겠다. 해석할 있음

 

 

malloc /free vs new/delete

  • 사용편의성 -> new/delete
  • 타입에 상관없이 특정한 크기의 메모리 영역을 할당 받으려면? -> malloc / free
  • 그런데 둘의 가장 근본적 중요한 차이는 new / delete (생성타입이 클래스일경우) 생성자/소멸자를 호출해준다!
728x90

'프로그래밍 > c++' 카테고리의 다른 글

얕은복사  (0) 2023.03.01
타입변환  (0) 2023.03.01
객체지향 마무리  (0) 2023.03.01
연산자 오버로딩  (0) 2023.03.01
초기화 리스트  (0) 2023.03.01

댓글