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

슝슝이님의 프로필 이미지
슝슝이

작성한 질문수

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

디버깅 문제 풀이 #3

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

작성

·

385

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

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

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

슝슝이님의 프로필 이미지
슝슝이
질문자

 

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

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의 원본객체주소 를 그대로 가리키고있게 되는건가요?

 

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

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

0

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

질문이 살짝 모호한데요

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

슝슝이님의 프로필 이미지
슝슝이

작성한 질문수

질문하기