인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

가또님의 프로필 이미지

작성한 질문수

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

디버깅 문제 풀이 #3

이중포인터로 해결 불가능하다 하셨는데

작성

·

238

0

처음에는 고민하다가 공격대상을 공격하기 직전에 대상을 확인하고 공격하는으로 해결했습니다만 (delete 코드 이후에 포인터를 받아서 썻습니다)

나중에 코드 추가등으로 인해 지금은 직전에 대상을 확인한다고 해도 그 사이에 대상 객체가 delete될수도 있겠다 싶어서 좀더 범용적인 해결방법을 위해 이중포인터로 해결을 했습니다.

전체 코드가 너무 긴 듯해 기본적으로 _target을 Player**로 들고있고 

_target을 사용하는부분을 모두 (*_target)으로 수정했습니다.

*Exercise_A.cpp  Arrow 생성되는 구문

Arrow* arrow = new Arrow(reinterpret_cast<Player**>(&knight), archer->_attack);

 

이 방법이 조금 더 범용적이라 생각했던 이유는

delete를 했을때 자신이 가지고있는 포인터는 nullptr로 바꿀 수 있으나 이걸 복사해 간 다른 포인터 변수들은 초기화 되지 않기 해당 포인터 자체를 가르키는 이중포인터로 해결하면 된다 생각했습니다.

이때 포인터를 하나를 두고 해당 포인터를 참조하려고하는 모든 이중포인터는 해당 포인터를 가리키게 한 뒤 nullptr체크를 한다면 해결 가능하다 생각했는데 혹시 어떠한 경우에 문제가 발생하게 되는지 궁금합니다.

만약 이중포인터로 해결이 불가능하다면

결국 어떤 객체의 포인터는 해당 객체를 delete하는곳에서만 관리를 하고 다른곳에서는 포인터를 가져가는게 아니라 해당 객체를 관리하는곳에  말씀하시느 ID등을 이용해서 객체 접근을 시도하는것이 안전한 방법이다 라고 생각했습니다!

이 부분도 혹시 틀린부분이 있으면 지적해주시면 감사하겠습니다.

앗 추가로 이걸 고치면서 static_cast는 이중포인터는 허락 안해준다는걸 알게됬네요!

답변 1

0

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

ID를 이용해서 중앙에서 객체들을 관리하고,
실시간으로 필요할 때마다 찾는 경우도 있긴 하지만
그렇게 할 경우 매 번 서치 비용이 드는 단점도 있고
멀티쓰레드 환경에서의 처리도 애매해집니다.
근본적으로 나중에 등장하는 스마트 포인터를 사용하는게 가장 좋은 해답입니다.

가또님의 프로필 이미지
가또
질문자

혹시 위와같이 이중포인터로 널포인트 체크를 하는 방법의 경우에 어떠한 문제점이 생길 수 있을까요??

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

원본 객체의 위치가 바뀔 수도 있고 기껏 널체크를 해도 다른 쓰레드에서 삭제할 수도 있고 나중에 가면 상황이 복잡해집니다.

가또님의 프로필 이미지

작성한 질문수

질문하기