작성
·
251
·
수정됨
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 인턴입니다.
스마트 포인터와 관련된 질문이신 것 같습니다. 지역 범위를 벗어난 후 shared_ptr의 동작이나 참조 카운트에 대해 궁금하신 부분이 있으신 것 같네요. 아래 링크의 유사한 질문에서 강사님께서 스마트 포인터의 작동 원리와 참조 카운트에 대해 자세히 설명해주셨습니다. 해당 답변이 도움이 될 것 같습니다.
위 링크의 답변들을 확인하시어 스마트 포인터의 동작 방식을 이해하시는 데 도움을 받으시길 바랍니다.
비슷한 부분을 질문한 사람도 있지만
질문의도가 조금 다른것같습니다
가능하다면 선생님께서 직접 답변을 달아주시면 정말좋겠습니다