• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

디버깅 문제풀이#3 10번문제 질문있습니다

23.08.10 13:56 작성 조회수 311

0

for (int i = 0; i < 10; i++)

{

arrows[i]->AttackTarget();

// 기사가 죽었으면 소멸시켜준다

if (knight != nullptr)

{

if (knight->IsDead())

{

delete knight;

knight = nullptr;

}

}

delete arrows[i];

arrows[i] = nullptr;

}

이부분에서 나이트를 delete 하고 nullptr 로 채우고나서

애로우 부분에

// 공격 대상이 있다면

if (_target != nullptr)

{

// 데미지를 입힌다

target->AddHp(-damage);

_target->PrintInfo();

}

_target을 nullptr 체크했는대 구문으로 왜 들어오는건가요..?

답변 2

·

답변을 작성해보세요.

0

image
위 상황에서 시작하는데요.
delete를 하고 arrow[i] = null로 밀었을 때의 결과는 다음과 같습니다.
image

슝슝이님의 프로필

슝슝이

질문자

2023.08.10

 

죄송합니다 제가 이해를 잘못한거같습니다

Knight* knight = new Knight();

Arrow* arrow = new Arrow(knight, archer->_attack);

arrows[i] = arrow;

//원본night 객체 삭제

delete knight;

//Knight*가 가리키고있는 주소 nullptr 로 민다.

knight = nullptr;

그럼 arrow[i]가 가지고있는 _target(knight) 포인터 는

arrow[i]안에서 _target을 nullptr로 채워주지않는 한

이미 밀려버린 knight의 원본객체주소 를 그대로 가리키고있게 되는건가요?

 

물론입니다.
그게 포인터와 C++ 의 어려운 부분이죠

0

질문이 살짝 모호한데요

if (_target != null) 안으로 들어온게 이해가 안 가시는건가요?