인프런 커뮤니티 질문&답변

문희찬님의 프로필 이미지
문희찬

작성한 질문수

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문

타입 변환 #5

자식 리소스 접근

작성

·

138

0

class Item { int _itemType=0;}

class Weapon: public Item { int _attack=2; }

라고 클래스를 정의할 때

Item* item = new Weapon();

이라고 선언한다면

item->_attack에 접근이 불가능합니다.

---- 질문1 -----

item->_attack에 접근하는 가장 현실적인 방법은 

Weapon* weapon = (Weapon*)item; 

새로운포인터를 선언하여 weapon->_attack으로 접근하는 것인가요?

---- 질문2 ----

virtual 소멸자 선언을 하지 않았을 경우, delete item; 는 Item에 대한 소멸자만 호출할 뿐 Weapon의 소멸자를 호출하지 않습니다. 그럼 힙영역에서 _itemType만 해제되고 _attack타입의 크기만큼 메모리 누수가 일어나나요? 

답변 3

2

Rookiss님의 프로필 이미지
Rookiss
지식공유자

1.

새로운 포인터를 선언하는건 필수 사항은 아니고,
일단 변환(캐스팅)을 해주면 됩니다.

((Weapon*)item)->_attack;

2.
그렇지는 않습니다.
Weapon 소멸자가 호출되지 않는 것은 맞지만
new 할 때, 할당 크기는 이미 힙 영역의 헤더에 들어가 있고
delete할 때는 그 정보를 토대로 메모리 정리가 이루어지기 때문에
전체 메모리 영역이 정상적으로 날라갑니다.
이를 가장 쉽게 테스트 할 수 있는 방법은 계속 new / delete를 무한 반복하고 
메모리 점유가 높아지는지를 확인하시면 됩니다.

문제의 상황은 Weapon class 자체에서 별도로 new를 한 애를 들고 있고,
이를 Weapon 소멸자에서 delete를 하는 등의 상황인데
이런 경우라면 그 객체가 소멸되지 않으니 메모리 누수가 일어나게 됩니다.
참고로 나중에 디버깅 연습 문제에서 이런 케이스를 확인하게 됩니다.

0

문희찬님의 프로필 이미지
문희찬
질문자

오타가 적으신것같은데 실례가 안된다면 무슨 키보드 쓰시는지 여쭤봐도 괜찮을까요?

Rookiss님의 프로필 이미지
Rookiss
지식공유자

주기적으로 바꾸는데 요즘은 손목이랑 손가락이 너무 아파서
키압이 극도로 낮은 Realforce R2 TL 30g 모델을 사용하고 있습니다.

문희찬님의 프로필 이미지
문희찬
질문자

답변해주셔서 감사합니다. 유튜브로 사용하시는 키보드 리뷰보고 구매페이지로 갔는데 가격보고 뒤로가기 눌렀네요 :)

Rookiss님의 프로필 이미지
Rookiss
지식공유자

가성비로는 바로 이전에 사용하던 cox 무접점 엠프리스 (35g) 이게 나쁘지 않았어요.

끝판왕인 realforce로 바꾸기 이전에 사용하던 키보드입니다.

0

문희찬님의 프로필 이미지
문희찬
질문자

2번질문에 대한 가벼운 예제로 확인해보니 메모리가 부모자식할것없이(?) 싹 날라가는것을 볼 수 있었습니다. 도움을 주셔서 감사합니다. 

문희찬님의 프로필 이미지
문희찬

작성한 질문수

질문하기