문제

다시 말해, 구현은 어떻게 카운트를 추적합니까?

MAP와 같은 객체가 유지되는 것은 무엇입니까? shared_ptr 키는 포인터의 주소와 값이 참조 수인 인스턴스? 내가 구현해야한다면 shared_ptr, 이것은 내 마음에 오는 첫 번째 아이디어입니다.

이러한 참조 카운팅 스마트 포인터의 경우 메모리 누출 가능성이 있습니까? 그렇다면 어떻게 피할 수 있습니까?

도움이 되었습니까?

해결책

나는 이것에 대한 두 가지 다른 비 침입 접근법을 보았다.

  1. 스마트 포인터는 참조 카운터를 포함하도록 작은 메모리 블록을 할당합니다. 그런 다음 스마트 포인터의 각 사본은 실제 객체에 대한 포인터와 참조 수에 대한 포인터를 수신합니다.
  2. 객체 포인터 외에도 각 스마트 포인터에는 이전 및 다음 포인터가 포함되어있어 특정 객체에 대한 이중으로 연결된 스마트 포인터 목록을 형성합니다. 참조 수는 목록에 암시 적입니다. 스마트 포인터가 복사되면 목록에 추가됩니다. 파괴되면 각 스마트 포인터는 목록에서 스스로를 제거합니다. 목록의 마지막이라면 참조 된 객체도 해방됩니다.

당신이 가면 여기 그리고 바닥으로 스크롤하면 이러한 방법을 훨씬 더 명확하게 설명하는 우수한 다이어그램이 있습니다.

다른 팁

참조 카운팅 스마트 포인터로 메모리 누출을 만드는 것은 매우 쉽습니다. 그래프에 사이클이있는 객체의 그래프와 같은 구조 만 작성하십시오. 사이클의 물체는 서로가 풀리지 못하게합니다. 예를 들어, 더블 링크 목록을 만들 때 한 번에 하나 이상의 객체를 제거하지 않아야합니다.

각 스마트 포인터 개체에는 공유 참조 수가 포함되어 있습니다.

당신은 볼 수 있습니다 이것 기사. 이 구현은 이것들을 주변에 복사하는 별도의 개체에 저장합니다. 당신은 또한 볼 수 있습니다 부스트의 문서 또는 위키 백과 기사 스마트 포인터에.

아니요. shared_ptr 참조 계산을 위해 하나의 추가 포인터를 유지하십시오.

shared_ptr 객체의 사본을 만들면 참조 수와 함께 포인터를 복사하고, 포함 된 객체에서 포인터를 복사합니다.

내가 기억하는 한, 효과적인 C ++의 장에서 처리 된 참조 계산 포인터의 문제가 있었다.

원칙적으로, 당신은 기준을 촉진하고 포인터 개체를 파괴하는 것을 알고있는 참조를 보유하는 클래스에 대한 포인터를 포함하는 "Light"포인터 클래스가 있습니다. 이 참조 계산 클래스는 참조 할 객체를 가리 킵니다.

많은 답변이 참조 수가 저장되는 방식을 다룹니다 (동일한 기본 포인터를 보유한 모든 shared_ptr에 대해 공유 메모리에 저장되어 있지만 대부분 누출 문제를 피하십시오.

참조 계산 포인터로 메모리를 새는 가장 쉬운 방법은 사이클을 만드는 것입니다. 예를 들어, 모든 포인터가 적어도 두 개의 요소를 갖는 공유 _ptr 인 이중 링크 된 목록은 삭제되지 않도록 보장됩니다. 외부 포인터가 해제 되더라도 내부 포인터는 여전히 계산되며 참조 수는 0에 도달하지 않습니다. 즉, 최소한 가장 순진한 구현이 있습니다.

사이클 문제에 대한 가장 쉬운 해결책은 Shared_ptr (참조 계수 포인터)를 객체의 소유권을 공유하지 않는 약한 포인터와 혼합하는 것입니다.

공유 포인터는 리소스 (포인터)와 추가 참조 _count 정보를 모두 공유합니다. 약한 포인터를 사용하면 참조 수가 두 배가됩니다. 공유 포인터 참조 수와 약한 포인터 참조 수가 있습니다. 공유 포인터 카운트가 0에 도달 할 때마다 리소스가 릴리스되지만, 마지막 약한 포인터가 해제 될 때까지 참조 _count 정보는 살아 남았습니다.

이중 링크 된 목록에서 외부 참조는 shared_ptr로 유지되는 반면 내부 링크는 약한 _ptr입니다. 외부 참조 (shared_ptr)가 없을 때마다 목록의 요소가 릴리스되어 약한 참조가 삭제됩니다. 결국 모든 약한 참조가 삭제되었고 각 리소스에 대한 마지막 약한 포인터는 참조 _count 정보를 해방시킵니다.

위의 텍스트보다 덜 혼란 스럽습니다 ... 나중에 다시 시도하겠습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top