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

Heca님의 프로필 이미지
Heca

작성한 질문수

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

Allocator

스마트포인터를 활용한 설계에 대한 질문

해결된 질문

작성

·

641

0

안녕하세요 루키스님 프로젝트에 스마트포인터를 사용해보려고하는데 제가 생각한 설계가 맞는지 궁금합니다

C++ 서버 강의에서 스마트포인터에 대한 설명을 들었는데 Shared_ptr은 상호참조문제가 있고 이를 해결하기 위해 Weak_ptr을 사용한다고 설명해주셨는데

Weak_ptr이나 Shared_ptr을 잘 사용해서 상호참조로 인한 문제를 잘 해결하면 좋겠지만 프로젝트 크기가 커지다보면 상호참조 관계를 명확하게 파악하기 어렵다는 단점이 존재할수 있다고 생각합니다

 

그래서 제가 생각한 방법은 어떤 객체에서 다른 객체의 생명주기를 자신이 직접 관장한다면 shared_ptr 그렇지않다면 weak_ptr로 멤버를 두고 관리하고 shared_ptr인 멤버는 항상 weak_ptr로 반환하도록 하는게 좋지 않나라는 생각입니다 강의에서 설명해주신 Knight를 예로들어보면

Knight끼리 서로를 타겟으로 지정할수 있다고 할때

 

Class Knight

private :

weak_ptr<Knight*> target

shared_ptr<Weaphon*> weaphon

 

위 코드를 예로들면 타겟 가능한 기사객체는 자기 자신이 생명주기를 관장하는 멤버가 아니기떄문에 weak로 두고 기사가 들고있는 무기의 경우는 기사가 죽을때 같이 사라지는게 자연스럽다고 볼수 있기 때문에 shared로 둬서 knight가 죽을떄 자연스럽게 같이 사라지도록 설계하고

만약 대장간 같은데서 강화를 위해서 weaphon을 참조해야한다면 Knight에서 weak_ptr<Weaphon*> GetWeaphon() 이런식으로 설계해서 상호참조를 예방할수 있도록 설계하는것이 어떻겠냐는 생각을 개인적으로 해봤는데 이에대해서 어떻게 생각하시는지 궁금합니다

 

 

 

답변 2

1

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

위에 말한 방법이 정석이긴 하지만
weak_ptr을 사용하면 그만큼 귀찮은 일이 많기 때문에
이건 프로젝트 리더가 선택해야 하는 영역입니다!

0

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

아 그리고 studio 2022에서 xalloc때문에 빌드 안되는 문제가 있습니다 visual studio 가 업데이트되면서 xalloc 매크로랑 겹치는 기본 헤더가 추가된내용이 있는거같습니다 일단 xxalloc로 바꿔서 사용하니 빌드 잘 됩니다

Heca님의 프로필 이미지
Heca

작성한 질문수

질문하기