• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

스마트포인터 25분 근처

24.01.03 22:15 작성 24.01.03 22:18 수정 조회수 122

0

같은부분 해봤습니다

visual studio 2022버전이고

컴파일러는 c++ 20 버전입니다

 

주석 단 것처럼 되는데 수업중 설명하고 다른거같습니다

출력하면 소멸되었다는 부분이 없다는건 똑같지만

 

&k2로 들어가지지도 않고

scope 후에 조사식에 k2를 쳐봐도 없다고 나옵니다

 

k2가 왜 삭제가 되는지 모르겠습니다

	shared_ptr<Knight> k1 = make_shared<Knight>();		// k1 생성될 때 k1의 ref count가 1로 초기화된다
	// 괄호 안은 ref count
	// k1 [		1]

	{
		shared_ptr<Knight>k2 = make_shared<Knight>();	// k2 생성될 때 k2의 ref count가 1로 초기화된다
		// k2 [		1]

		k1->_target = k2;		// k2를 타겟으로 하고 있어서 k2의 ref count가 올라간다
		// k2 [		2]

		k2->_target = k1;		// k1을 타겟으로 하고 있어서 k1의 ref count가 올라간다
		// k1 [		2]
	}
	// scope가 끝나서 k2가 참고하는 객체가 사라졌다... 사라지면 안되는거 아닌가?
	// k1을 타겟으로 하던 k2가 사라졌지만
	// k1 [		2]가 유지되었다	


	k1->Attack();

답변 2

·

답변을 작성해보세요.

1

조사식에 없다고 Knight 객체가 메모리에서 사라진 것은 아닙니다.
말 그대로 변수 k2 로는 접근이 안 되는 이유는
k2 변수 자체는 소멸되었기 때문입니다 (하지만 k2가 가리키던 Knight 객체는 살아있음)

k1->Attack 부근에서 breakpoint를 걸고,
반드시 k1에서 _target이 있는지를 확인해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.01.03

안녕하세요, 인프런 AI 인턴입니다.

스마트 포인터와 관련된 질문이신 것 같습니다. 지역 범위를 벗어난 후 shared_ptr의 동작이나 참조 카운트에 대해 궁금하신 부분이 있으신 것 같네요. 아래 링크의 유사한 질문에서 강사님께서 스마트 포인터의 작동 원리와 참조 카운트에 대해 자세히 설명해주셨습니다. 해당 답변이 도움이 될 것 같습니다.

위 링크의 답변들을 확인하시어 스마트 포인터의 동작 방식을 이해하시는 데 도움을 받으시길 바랍니다.

JM님의 프로필

JM

질문자

2024.01.03

비슷한 부분을 질문한 사람도 있지만

질문의도가 조금 다른것같습니다

가능하다면 선생님께서 직접 답변을 달아주시면 정말좋겠습니다