프로그래밍 언어/C++

[게임 프로그래머 입문 올인원] 동적할당과 캐스팅 : 동적할당 기초 (35강)

순정법사 2023.09.14

A. 동적할당 기초

1. 컴퓨터 이해하기

a. 동적 할당의 필요성

만약 MMORPG 게임을 만든다고 하고 몬스터를 50만 마리를 생성해야 한다고 할 때

stack 영역에 몬스터 객체를 많이 생성하게 되면 공간이 부족해지고,

메모리 영역에 할당하면 계속 그 메모리를 가지고 가야한다는 부담이 생김

 

스택 영역에 할당하면 공간 부족으로 에러 / 메모리일 경우 에러는 안나지만 부담

 

b. 동적할당이란?

🌟 실시간으로 메모리를 할당받아서 사용하는 것

 

  • 유저 영역 : 사용자가 사용하는 동작하는 프로그램 
  • 커널 영역 : 운영체제가 돌아가는 영역

 

유저 영역에서 메모리를 실시간으로 요청  ➡ 커널 영역이 더 많은 공간을 할당

 

c. 메모리 동적 할당하는 2가지 방법

1) malloc + free

 

🌟 malloc함수로 heap 영역에 공간을 할당해줌 / free는 반대 개념

 

  • C에서 등장한 개념
  • 할당된 공간의 주소값을 뱉기 때문에 포인터로 받아줘야 함

 

따라서 위 코드를 아래와 같이 사용

 

 

💙 Heap 영역

heap 영역은 메모리의 90%를 차지하고
굉장히 안전하게 잘 사용할 수 있는 공간이지만
💥 직접적으로 관리해줘야 한다는 단점이 있음

 

2) new + delete

 

🌟  malloc과 마찬가지로 heap 메모리를 동적으로 할당해줌 / delete 반대 개념

 

  • C++에서 등장한 개념
  • 할당된 공간의 주소값을 뱉기 때문에 포인터로 받아줘야 함
  • 생성자, 소멸자를 호출함

 

일반적인 버전
이렇게 배열로 사용할 수 있지만 거의 사용 X / 인스턴스의 각각의 생성자를 호출

 

📌 malloc와의 차이점은 생성자 호출 유무 (new만 호출)

당연하게도 C에서는 클래스가 없기 때문에 생성자를 호출할 이유가 없음
new에서만 생성자를 호출한다!!

 

d. 메모리 해제 후 사용? (use-after-free)

1) 문제 발견

 

2) 오류가 안남

 

위와같이 메모리를 해제한 후에도 오류가 나지 않는 이유는

heap 영역의 동적할당 특징 때문

 

이렇게 delete가 바로 소멸의 개념이 아님

 

2) 해결법

 

주소값을 null로 남겨주기

 

 

e. 포인터가 유효한지 체크하는 방법

1) 문제 발견

 

💥 메모리 관리가 어려운 이유 중 하나는 포인터를 다른 객체의 변수로 사용하고 있을 때 발생


player->_target = m1이 위험함

위 코드처럼 다른 클래스의 멤버 변수가 포인터를 주시하고 있는 경우
m1을 해제한다고 하더라고 메모리 오염이 일어나기 때문에 정말 조심해야 함!!
언제 어디서 어느코드에서 문제가 일어날지 모르기 때문

 

2) 해결법

 

따라서 아래 코드와 같이 플레이어를 찾지 못하면 널포인터를 반환하는 코드를 생성하고

 

TODO에 player를 찾는 코드 작성

 

찾았을 때에만 실행할 수 있도록 할 수 있음

 

이렇게 nullptr가 아닐 경우 실행하도록 해야 함

 

 

 


출처 : https://www.inflearn.com/course/%EA%B2%8C%EC%9E%84-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8-%EC%9E%85%EB%AC%B8-%EC%98%AC%EC%9D%B8%EC%9B%90-rookiss#curriculum

 

[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버 -

어디부터 시작할지 막막한 게임 프로그래밍 입문자를 위한 All-In-One 커리큘럼입니다. C++, 자료구조/알고리즘, STL, 게임 수학, Windows API, 게임 서버 입문으로 이어지는 알찬 커리큘럼으로 게임 프

www.inflearn.com