작성
·
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는 이중포인터는 허락 안해준다는걸 알게됬네요!
혹시 위와같이 이중포인터로 널포인트 체크를 하는 방법의 경우에 어떠한 문제점이 생길 수 있을까요??