inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

디버깅 문제 풀이 #3

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

268

가또

작성한 질문수 16

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는 이중포인터는 허락 안해준다는걸 알게됬네요!

C++

답변 1

0

Rookiss

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

0

가또

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

0

Rookiss

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

visualstudio에서 파일분할관리실습시 설정 문의를 드립니다.

0

545

1

정렬함수 좀 더 확실하게 이해 할 방법이 있을까요?

0

445

1

strcpy() 구현 관련 질문

0

517

1

빌드(망치)를 누르니 이런 오류가 떴습니다. 어떻게 해야 하나요?

0

459

1

클래스 타입의 포인터 질문합니다

0

549

1

입력값을 enum 값에 넣어주는거 이제 막혔나요?

0

500

1

템플릿 특수화 관련 질문

0

387

1

포인터 관련 질문합니다!

0

267

1

Unable to start assembler. Check your settings.

0

838

2

cpu선택

0

543

1

포인터 질문이 있습니다

0

328

1

20:35 에서 구조체 크기에 대한 질문입니다!

0

588

1

iterator 삭제관련

0

410

1

함수 호출을 디스어셈블러로 분석하다가 궁금점이 생겼습니다!

0

314

1

15 분 45초 대 질문

0

312

0

스택 프레임 질문합니다!

2

308

1

오른값 참조 in 게임

0

387

0

동적할당 질문이 있습니다

0

452

1

안녕하세요 메모리에 대해 질문드립니다.

0

308

1

함수객체 의 매개변수

0

363

1

복사생성자

0

438

1

main이나 endl 부분이 주황색으로 표시된건 어떻게 하나요

0

424

1

포인터 실습 강의를 보고 궁금한게 있습니다.

0

358

1

스택 오버플로우

2

793

1