shared_ptr로 연결한 부모와 자식이 해제되지 않습니다. weak_ptr로 바꿀 참조는 어떻게 정하나요?
잠깐, 답변을 보기 전에
먼저 내 말로 설명해 볼까요?
답변과 점검 포인트 펼치기답변 접기
구두 답변
정의를 외우기보다, 원리와 조건을 연결해 설명해 보세요.
shared_ptr의 강한 소유 관계가 순환하면 외부 참조를 지워도 참조 수가 0이 되지 않을 수 있습니다. 실제 소유 방향과 관찰 관계를 나누고 소유하지 않는 역참조에 weak_ptr을 검토합니다.
동작 원리와 전제
부모가 자식을 소유하고 자식은 부모를 관찰한다면 자식의 역참조를 약하게 둘 수 있습니다. weak_ptr을 사용할 때 lock으로 강한 참조를 얻고 성공 여부를 확인해야 합니다. expired 확인 후 별도로 raw pointer를 쓰면 그 사이 해제될 수 있습니다.
선택과 실패 처리
콜백이 자신을 shared_ptr로 캡처하고 객체가 콜백을 보관하는 순환도 찾습니다. 약한 캡처는 객체 소멸 뒤 작업을 생략할 수 있다는 의미이므로 반드시 완료해야 할 작업의 소유권은 다른 곳에 둬야 합니다.
구체적인 사례와 검증
약한 참조를 lock해서 얻은 shared_ptr은 그 지역 사용 범위 동안 객체 수명을 유지합니다. lock이 실패하면 객체가 이미 사라진 정상 상태로 처리하고 raw pointer로 다시 접근하지 않습니다. 같은 객체의 약한 참조가 살아 있어도 객체 자체가 살아 있는 것은 아닙니다. 보상 지급처럼 반드시 끝내야 할 작업을 UI 객체 수명에 약하게 묶으면 화면이 닫힐 때 작업을 잃을 수 있으므로 별도 서비스가 작업을 소유해야 합니다. 반대로 화면 갱신 callback은 객체가 사라지면 생략하는 것이 맞을 수 있습니다. 어떤 참조가 소유이고 어떤 참조가 관찰인지 기능별로 정의하는 것이 중요합니다.
외부 참조 제거·동시 lock·콜백 취소·컨테이너 순환을 시험합니다. 참조 계수의 스레드 안전성과 객체 필드의 동시성은 별개입니다. 누수를 줄이기 위해 모든 참조를 weak로 바꾸면 필요한 수명이 사라질 수 있어 소유 모델부터 정합니다.
득점 포인트
이해가 드러나는 지점을 확인해 보세요.
- 핵심 구분: shared_ptr의 강한 소유 관계가 순환하면 외부 참조를 지워도 참조 수가 0이 되지 않을 수 있습니다.
- 선택 조건: 콜백이 자신을 shared_ptr로 캡처하고 객체가 콜백을 보관하는 순환도 찾습니다.
- 검증 기준: 외부 참조 제거·동시 lock·콜백 취소·컨테이너 순환을 시험합니다.
감점 포인트
놓치기 쉬운 조건과 오해를 짚어 보세요.
- weak_ptr의 expired 검사만 한 뒤 raw pointer를 계속 사용한다.
더 파고들 거리
하나 더 질문하며 이해의 범위를 넓혀 보세요.
- 공유 소유권이 객체를 살려 두는 것과 필드 동시 수정의 안전성은 어떻게 다른가요?
- 콜백과 객체가 서로 소유할 때 어떤 참조를 약하게 해야 실제 수명이 맞나요?
- 상위 요청이 끝났는데 고루틴이 남으면 정상 대기와 누수를 어떻게 구분하나요?
득점·감점 포인트는 학습용 자기 점검 기준이며, 특정 회사의 실제 채점표가 아닙니다.
원리부터 공부하고 싶다면
답변을 보충하는 개념·예제·슈도코드를 읽어 보세요.