문제

예외로부터 안전한 메모리 관리를 얻으려면 RAW 포인터를 어떤 형태로든 스마트 포인터로 래핑해야 한다는 것을 우리 모두 알고 있습니다.그러나 포인터 컨테이너의 경우 문제는 더욱 까다로워집니다.

std 컨테이너는 포함된 객체가 복사 가능하다고 주장하므로 std::auto_ptr의 사용을 배제하지만 여전히 Boost::shared_ptr 등을 사용할 수 있습니다.

그러나 포인터를 안전하게 보관하도록 명시적으로 설계된 일부 부스트 컨테이너도 있습니다.
보다 포인터 컨테이너 라이브러리

질문은 ~이야:어떤 조건에서 smart_pointers 컨테이너보다 ptr_containers를 사용하는 것을 선호해야 합니까?

boost::ptr_vector<X>

or

std::vector<boost::shared_ptr<X> >
도움이 되었습니까?

해결책

부스트 포인터 컨테이너는 보유한 리소스에 대해 엄격한 소유권을 갖습니다.std::Vector<boost::shared_ptr<X>>는 소유권을 공유합니다.이것이 필요할 수 있는 이유가 있지만 그렇지 않은 경우 기본적으로 Boost::ptr_Vector<X>를 사용합니다.YMMV.

다른 팁

정상에:스마트 포인터는 리소스 관리를 처리하는 매우 좋은 방법이지만 유일한 방법은 아닙니다.잘 작성된 C++ 코드에는 원시 포인터가 거의 표시되지 않는다는 점에 동의합니다. 하지만 내 경험상 스마트 포인터도 그렇게 많이 표시되지는 않습니다.원시 포인터 컨테이너를 사용하여 구현된 완벽하게 예외로부터 안전한 클래스가 많이 있습니다.

음, 오버헤드는 하나의 경우입니다.

공유 포인터 벡터는 크기 조정 시 새 스마트 포인터 생성, 참조 증가, 참조 감소 등을 포함하는 많은 외부 복사를 수행합니다.포인터 컨테이너를 사용하면 이 모든 것을 피할 수 있습니다.

컨테이너 작업에 병목 현상이 발생하는지 확인하려면 프로파일링이 필요합니다. :)

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