• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

17:50 포인터 배열 질문

22.08.16 10:25 작성 조회수 106

0


int arr[3] = {};

이것은 정수형 배열이라 전체 크기는 12바이트 이고 0번째 주소값을 4바이트로 크기를 할당한 것.

int* arr2[3] = {};

이것은 포인터 배열(정수형)

이고 0번째 주소부터 접근을 하면

그곳에는 정수형으로 해석할 주소값이 들어가있다라는 의미.
(어떠한 정수형 데이터의 주소값이 있을 것.)

이렇듯 배열도 배열의 자료형 == 타입(크기)과 들어올 데이터의 자료형 == 타입(크기)이 일치 해야 하는데

이해가 안가는 부분이 현재


- Itme 클래스 크기
sizeof(Item) = _itemType(4), _ ItemDbid(4), _dummy(4096) => 4104Byte


- Weapon 클래스 크기
sizeof(Weapon) = sizeof(Item) + _damage(4) => 4108Byte

- Armor 클래스 크기
sizeof(Weapon) = sizeof(Item) + _defense(4) => 4108Byte

이상태에서

rand값에 따라 switch 분기를 하여 1이 나왔을 경우

Item[0] = new Weapon를 해주게 되는데

이럴경우 아까 포인터 배열과 똑같이 해석을 하면

"0번째 주소부터 접근을 하면 그곳에는 Itme으로 해석할 주소값이 들어가있다라는 의미."

파생 클래스의 메모리 구조는 직렬형태라

[Item클래스 시작 주소값] [Weapon클래스 시작 주소값]

형태라 Weapon을 동적할당하여 Item 포인터 배열에 데이터를 넣을 수 있는 것 까지는 이해하였습니다.

그런데

4108바이트 짜리를 4104바이트로 해석을 한다는 의미이니

Item[0]->_damage = 10; 이렇게 값을 접근을 못하는것 아닌가요?

 

(Weapon클래스의 _damage 부분이 짤렷으니)

 

(추가적으로 접근을 한다면은 다른 메모리를 침범할 수 있는 메모리 오염이 발생)

 

그래서 타입변환 5 강의에서 다시 for 문안에서

nullptr체크를 해준다음에

ItemType에 따라서

(Weapon*)item; 이렇게 형변환하여 Weapon의 멤버 변수에도 접근을 할 수 있게 해준 것인가여요?

아니면 제가 아예 다르게 이해를 하고있는것인지 여쭤보고 싶습니다 :)

답변 1

답변을 작성해보세요.

1

4108바이트 짜리를 4104바이트로 해석을 한다는 의미이니
Item[0]->_damage = 10; 이렇게 값을 접근을 못하는것 아닌가요?
(Weapon클래스의 _damage 부분이 짤렷으니)

네 문법적으로 안 됩니다. 아이템 클래스의 Item* 으로 인식하고 있니깐요.

(추가적으로 접근을 한다면은 다른 메모리를 침범할 수 있는 메모리 오염이 발생)

네 맞긴 하지만, 정확히 말하면
메모리 침범 = 메모리 오염은 아닙니다.

원본 객체가 Weapon타입이 맞다면, 딱히 메모리 오염은 아니겠죠.
형변환을 해서 접근하거나, 포인터 주소값 덧셈을 이용해서
Weapon에 해당하는 메모리를 사용해도 괜찮지만
정말 정말 정말 Knight 타입이 맞는지 확실한 상태에서 진행해야 할 것입니다.
(dynamic_cast을 한다거나, Item의 타입을 별도로 변수로 넣어준다거나..)

starkshn님의 프로필

starkshn

질문자

2022.08.16

아넵 이해되었습니다! 감사합니다~